自适应的直方图均衡化
整幅图像会被分成很多小块,这些小块被称为“tiles”。然后再对每一个小块分别进行直方图均衡化。如果有噪声的话,噪声会被放大。为了避免这种情况的出现要使用对比度限制。对于每个小块来说,如果直方图中的 bin 超过对比度的上限的话,就把 其中的像素点均匀分散到其他 bins 中,然后在进行直方图均衡化。
cv.createCLAHE(clipLimit, tileGridSize)
clipLimit: 对比度限制,默认是40tileGridSize: 分块的大小,在 OpenCV 中 tiles 的 大小默认为8 * 8
将整幅图像分成很多小块,然后再对每一个小块分别进行直方图均衡化,最后进行拼接。
import cv2 as cvfrom matplotlib import pyplot as plt# 1. 以灰度图形式读取图像img1 = cv.imread('./1.png', 0)img2 = cv.imread('./2.png', 0)# 2. 创建一个自适应均衡化的对象,并应用于图像clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))cl1 = clahe.apply(img1)clahe2 = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))cl2 = clahe.apply(img2)# 3. 图像展示fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8), dpi=100)axes[0, 0].imshow(img1, cmap=plt.cm.gray)axes[0, 0].set_title("原图")axes[0, 1].imshow(cl1, cmap=plt.cm.gray)axes[0, 1].set_title("自适应均衡化后的结果")axes[1, 0].imshow(img2, cmap=plt.cm.gray)axes[1, 0].set_title("原图")axes[1, 1].imshow(cl2, cmap=plt.cm.gray)axes[1, 1].set_title("自适应均衡化后的结果")plt.show()
如果觉得《OpenCV 自适应的直方图均衡化》对你有帮助,请点赞、收藏,并留下你的观点哦!