直方图均衡化、对数变换、伽马变换(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比特的显示器中进行显示,则需要将其规范化到(0255)中,我这里将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进行还原。    

相关