直⽅图均衡化、对数变换、伽马变换(python完成)
1.直⽅图均衡化(使⽤python完成):
①:计算图⽚原始的灰度分布:
def Grayscale_Probability(img): #输⼊img是读取后的灰度图数据
prob = s(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个灰度级,进⾏四舍五⼊,⽤und(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进⾏还原。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论