直方图均衡化、对数变换、伽马变换(python完成)
1.直方图均衡化(使用python完成):
①:计算图片原始的灰度分布:
def Grayscale_Probability(img): #输入img是读取后的灰度图数据
prob = torch.zeros(256)
for i in img:
for j in i:
prob[j] += 1
h, w = img.shape #图片大小为753*759
return prob/(w*h) #返回每个灰度值的概率
②:根据灰度概率计算累计概率并进行直方图均衡化:
def Equalization(img,prob):
for i in range(1,256): #先进行累计概率的计算
prob[i] = prob[i]+prob[i-1]
#进行像素值映射,256个灰度级,进行四舍五入,用torch.round(255 * prob[i])也可
img_map = [int(255 * prob[i]+0.5) for i in range(256)]
h, w = img.shape
for ri in range(h):#替换原图像灰度
for ci in range(w):
img[ri, ci] = img_map[img[ri, ci]]
return img
2.对数变换:
对数变换能将图像中,范围较窄的低灰度值映射为范围较宽的灰度值,或将范围较宽的高灰度值映射为范围较窄的灰度值,适用于扩展图像中的暗像素值,同时压缩更高灰度级的值。将图象的灰度值进行log变换,表达式为:,其中,r表示原始图像的灰度级,s表示变换后的灰度级,c为一常数:
def Logtrans(img,c):
ir, ic = img.shape
res = np.zeros((ir,ic),dtype=np.uint8)
for imgr in range(ir):
for imgc in range(ic):
res[imgr,imgc] =np.uint8(c * np.log(1.0 + img[imgr,imgc]) + 0.5)
return res
注意:经过log变换后灰度值从0-255变成了0-5.5,需要在8比特的显示器中进行显示,则需要将其规范化到(0,255)中,我这里将c设为46来简单替代了此操作。
3.伽马变换:
伽马变换可以很好地拉伸图像的对比度,扩展灰度级。由图可知,当图像的整体灰度偏暗时,选择y<1,可以使图像增亮;当图像整体灰度偏亮时,选择y>1,可以使图像变暗,提高图像的对比度,凸显细节。
def gama(img,c,y):
ir, ic = img.shape
res = np.zeros((ir,ic),dtype=np.uint8)
for imgr in range(ir):
for imgc in range(ic):
res[imgr,imgc] =np.uint8(c * np.power(img[imgr,imgc]/255,y)*255 + 0.5)
return res
注意:在经过算式后,灰度值易出现高于255的情况。我先将图像灰度值压缩至0-1内,经过运算后再乘以255进行还原。