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進行還原。