直方图均衡化增加图像的全局对比,直方图均值化,将低灰度值归并,高灰度值拉伸,当一个图像灰度分布均匀时,图像的整体细节与质量会提升很多
公式:
公式推导:
推导截图源自 直方图均衡化_schwein_van的博客-CSDN博客_直方图均衡化 该大佬博客
步骤:(以灰度深度8为例)
1,统计每个阶级灰度值的数量
2,计算每个阶级灰度值出现的概率
3,将每个概率的灰度值以前缀和的形式累加
4,将图片代入计算,p[x,y]*img[x,y]
原图
变换后的图像
可以明显的发现,太阳表面的光斑纹理更加清晰
代码:
def histogramEqualization(img, RGB=True):
newImg = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)
N = img.shape[0] * img.shape[1]
BGR = np.zeros((3, 256), dtype=np.float)
for i in range(0, img.shape[0]):
for j in range(0, img.shape[1]):
BGR[0][img[i][j][0]] += 1
BGR[1][img[i][j][1]] += 1
BGR[2][img[i][j][2]] += 1
Pr = BGR / N
Ps = np.zeros((3, 256), dtype=np.float)
for i in range(0, 256):
if i == 0:
Ps[:, i] = Pr[:, i]
else:
Ps[:, i] += Ps[:, i - 1] + Pr[:, i]
for i in range(0, img.shape[0]):
for j in range(0, img.shape[1]):
b, g, r = img[i, j, :]
newImg[i][j] = [round(Ps[0][b] * 255), round(Ps[1][g] * 255), round(Ps[2][r] * 255)]
otherImg = cv2.equalizeHist(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
return newImg, otherImg