自己写代码实现AHE(自适应直方图均衡化) 要求生成的图比现有的原图小一圈,在jupyterlab上实现,并用plt输出
时间: 2024-03-19 20:44:16 浏览: 61
好的,以下是Python实现AHE算法的代码,可以在jupyterlab上实现,生成的图比原图小一圈,并使用matplotlib库的pyplot模块输出:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
def ahe(img):
h, w = img.shape[:2]
padded_img = cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_REFLECT)
out_img = np.zeros((h, w), dtype=np.uint8)
for i in range(1, h+1):
for j in range(1, w+1):
window = padded_img[i-1:i+2, j-1:j+2]
hist, _ = np.histogram(window, bins=256, range=(0, 255))
cdf = np.cumsum(hist)
cdf_min = cdf[window[1,1]]
out_img[i-1, j-1] = int((cdf[window[1,1]]-cdf_min) / ((3*3-1) - cdf_min) * 255)
return out_img
img = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)
out_img = ahe(img)
# 去除边框
h, w = img.shape[:2]
out_img = out_img[1:h+1, 1:w+1]
plt.figure(figsize=(10, 10))
plt.subplot(1,2,1)
plt.imshow(img, cmap='gray')
plt.title('Input Image')
plt.axis('off')
plt.subplot(1,2,2)
plt.imshow(out_img, cmap='gray')
plt.title('AHE Output')
plt.axis('off')
plt.show()
```
在这个实现中,我们使用`copyMakeBorder`函数在原始图像周围添加了一圈边框,然后在处理像素时只处理内部的像素。最终输出的图像大小比原始图像小一圈。输出使用subplot函数生成一个包含两个子图的图像,分别显示原始图像和AHE处理后的图像。
阅读全文