直方圖均衡化、對數變換、伽馬變換(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進行還原。    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM