不要用cv2.createCLAHE的条件下, 用Numpy实现的CLAHE函数,输入是彩图
时间: 2024-05-07 12:20:03 浏览: 67
好的,我可以给你提供一个基于Numpy实现的CLAHE函数,可以处理彩色图像。
```python
import numpy as np
def clahe(img, clip_limit=2.0, grid_size=(8,8), channel='rgb'):
"""
Numpy implementation of Contrast Limited Adaptive Histogram Equalization (CLAHE) for RGB images.
:param img: input RGB image
:param clip_limit: threshold for contrast limiting
:param grid_size: size of the grid for histogram equalization
:param channel: color channel to apply CLAHE on. 'r', 'g', 'b', or 'rgb'
:return: CLAHE-enhanced RGB image
"""
if channel == 'r':
img = img[:,:,0]
elif channel == 'g':
img = img[:,:,1]
elif channel == 'b':
img = img[:,:,2]
h, w = img.shape[:2]
h_grid, w_grid = grid_size
clahe_img = np.zeros_like(img)
for i in range(h_grid):
for j in range(w_grid):
# compute histogram of the current grid
i_min, i_max = int(i*h/h_grid), int((i+1)*h/h_grid)
j_min, j_max = int(j*w/w_grid), int((j+1)*w/w_grid)
hist, _ = np.histogram(img[i_min:i_max,j_min:j_max], bins=256, range=(0,256))
# limit histogram
cdf = np.cumsum(hist)
cdf = (cdf / cdf[-1]).astype(np.float32)
cdf = np.maximum(cdf - clip_limit/(h_grid*w_grid), 0)
cdf = cdf / (1 - clip_limit/(h_grid*w_grid))
# apply histogram equalization
grid_img = img[i_min:i_max,j_min:j_max]
grid_img = np.interp(grid_img, np.arange(256), cdf*255).astype(np.uint8)
clahe_img[i_min:i_max,j_min:j_max] = grid_img
if channel == 'rgb':
clahe_img = np.stack([clahe_img]*3, axis=-1)
elif channel == 'r':
clahe_img = np.stack([clahe_img]*3, axis=-1)
clahe_img[:,:,1:] = img[:,:,1:]
elif channel == 'g':
clahe_img = np.stack([img[:,:,0], clahe_img, img[:,:,2]], axis=-1)
elif channel == 'b':
clahe_img = np.stack([img[:,:,:2], clahe_img], axis=-1)
return clahe_img
```
这个函数的输入是一个RGB图像,输出是CLAHE增强后的RGB图像。你可以自己指定一些参数,例如`clip_limit`是限制对比度的阈值,`grid_size`是直方图均衡化的网格大小,`channel`是你想要对哪个颜色通道进行CLAHE增强。如果你想对所有颜色通道进行CLAHE增强,可以将`channel`设置为'rgb'。
阅读全文