自适应的直方图均衡化
整幅图像会被分成很多小块,这些小块被称为“tiles”。然后再对每一个小块分别进行直方图均衡化。如果有噪声的话,噪声会被放大。为了避免这种情况的出现要使用对比度限制。对于每个小块来说,如果直方图中的 bin 超过对比度的上限的话,就把 其中的像素点均匀分散到其他 bins 中,然后在进行直方图均衡化。
cv.createCLAHE(clipLimit, tileGridSize)
- clipLimit: 对比度限制,默认是40
- tileGridSize: 分块的大小,在 OpenCV 中 tiles 的 大小默认为8 * 8
将整幅图像分成很多小块,然后再对每一个小块分别进行直方图均衡化,最后进行拼接。
import cv2 as cv
from 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()