AHE和CLAHE代码实现
时间: 2024-05-04 15:21:14 浏览: 79
AHE(自适应直方图均衡化)和CLAHE(对比度受限的自适应直方图均衡化)是两种图像增强技术。以下是Python中实现AHE和CLAHE的示例代码:
AHE代码实现:
```python
import cv2
import numpy as np
def ahe(img, clip_limit=2.0, tile_size=8):
"""自适应直方图均衡化"""
h, w = img.shape
img_eq = np.zeros((h, w), dtype=np.uint8)
for i in range(0, h, tile_size):
for j in range(0, w, tile_size):
# 获取当前块
block = img[i:i+tile_size, j:j+tile_size]
# 计算当前块的直方图
hist, _ = np.histogram(block.flatten(), bins=256, range=(0, 255))
# 计算累积直方图
cdf = hist.cumsum()
cdf = (cdf - cdf.min()) / (tile_size * tile_size - cdf.min())
# clip limit
cdf = np.clip(cdf, 0, clip_limit)
# 直方图均衡化
block_eq = np.interp(block.flatten(), np.arange(256), cdf * 255).astype(np.uint8)
# 将均衡化后的块放回原图
img_eq[i:i+tile_size, j:j+tile_size] = block_eq.reshape((tile_size, tile_size))
return img_eq
```
CLAHE代码实现:
```python
def clahe(img, clip_limit=2.0, tile_size=8):
"""对比度受限的自适应直方图均衡化"""
h, w = img.shape
img_eq = np.zeros((h, w), dtype=np.uint8)
for i in range(0, h, tile_size):
for j in range(0, w, tile_size):
# 获取当前块
block = img[i:i+tile_size, j:j+tile_size]
# 计算当前块的直方图
hist, _ = np.histogram(block.flatten(), bins=256, range=(0, 255))
# 计算累积直方图
cdf = hist.cumsum()
cdf = (cdf - cdf.min()) / (tile_size * tile_size - cdf.min())
# clip limit
cdf = np.clip(cdf, 0, clip_limit)
# 直方图均衡化
block_eq = np.interp(block.flatten(), np.arange(256), cdf * 255).astype(np.uint8)
# 将均衡化后的块放回原图
img_eq[i:i+tile_size, j:j+tile_size] = block_eq.reshape((tile_size, tile_size))
# 计算全局直方图
hist, _ = np.histogram(img_eq.flatten(), bins=256, range=(0, 255))
# clip limit
cdf = hist.cumsum()
cdf = (cdf - cdf.min()) / (h * w - cdf.min())
cdf = np.clip(cdf, 0, clip_limit)
# 直方图均衡化
img_eq = np.interp(img_eq.flatten(), np.arange(256), cdf * 255).astype(np.uint8)
img_eq = img_eq.reshape((h, w))
return img_eq
```
以上代码中,`clip_limit`表示对比度限制因子,`tile_size`表示块的大小。在AHE中,每个块的直方图是独立计算的,而在CLAHE中,每个块的直方图都受到全局直方图的约束。
阅读全文