自己写代码实现AHE(自适应直方图均衡化) 要求生成的图比原图小一圈,用plt输出
时间: 2024-03-19 07:44:02 浏览: 68
好的,以下是Python实现AHE算法的代码,可以生成比原图小一圈的图像,并使用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)
# 去除边框
out_img = out_img[1:-1, 1:-1]
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
axs[0].imshow(img, cmap='gray')
axs[0].set_title('Input Image')
axs[1].imshow(out_img, cmap='gray')
axs[1].set_title('AHE Output')
plt.show()
```
在这个实现中,我们使用`copyMakeBorder`函数在原始图像周围添加了一圈边框,然后在处理像素时只处理内部的像素。最终输出的图像大小与原始图像相同。如果要生成的图比原图小一圈,则可以在输出之前将边框去除。输出使用subplots函数生成一个包含两个子图的图像,分别显示原始图像和AHE处理后的图像。
阅读全文