影象處理與影象識別筆記(三)影象增強1
影象增強的目的是為了改善影象的視覺效果,為了更便於人或機器的分析和處理,在不考慮影象降質(前提)的情況下,提高影象的可觀性。灰度變換是一種典型的影象增強方法,我們通常把影象處理按照處理方法分成空域方法與頻域方法兩類,灰度變換是一種對點處理的空域處理方法。
一、灰度變換
將一個灰度區間對映到另一個灰度區間的變換稱為灰度變換,
,灰度區間是指
的灰度值區間,
是黑色,
是白色。灰色變換可使影象動態範圍加大,影象對比度擴充套件,影象清晰,特徵明顯。灰度變換可以分為線性變換和非線性變換。
1、線性變換
原始影象:
,灰度範圍:
,變換後的影象:
,灰度範圍:
,存在以下變換關係:
2、非線性變換
灰度變換的非線性變換方法包括對數變換和指數變換,對數變換公式為
,這個變換擴充套件低灰度區的對比度,壓縮高灰度值。指數變換公式為
,與對數變換相反, 指數變換對影象的高灰度區有較大的擴充套件。
線性灰度變換例項如下,
import cv2
import numpy as np
import matplotlib.pyplot as plt
import pylab
def grayTransformLine(img,c,d):#線性灰度變換
img = img/255.0 #轉換為0-1
Min = img.min()
Max = img.max()
return (d-c)/(Max-Min)*(img-Min)+c
def main():
img = cv2.imread('Lena.jpg',0)
new_img = grayTransformLine(img,0.5,1)#變換到0.5-1,整體變亮
new_img2 = grayTransformLine(img,0,0.5)#變換到0-0.5,整體變灰暗
cv2.imshow('bright',new_img)
cv2.imshow('dark',new_img2)
cv2.waitKey(0)
if __name__ == "__main__":
main()
輸出結果如下,
3、灰度直方圖
影象中畫素灰度分佈的概率密度函式,設影象尺寸為
,共有
級灰度,並且具有灰度級
的畫素數為
,則有:
,下面我們來計算影象的灰度直方圖。
import cv2
import numpy as np
import matplotlib.pyplot as plt
import pylab
img = cv2.imread('Lena.jpg',0)
#images:輸入影象,channels:影象的通道,mask:掩膜影象,若計算整幅圖則為none,histSize:灰度級的個數
#ranges:畫素值的範圍
hist_cv = cv2.calcHist(images=[img],channels=[0],mask=None,histSize=[256],ranges=[0,255])
plt.plot(hist_cv)
pylab.show()
上述兩幅圖的灰度直方圖如下所示,
明顯看出,第一幅圖的灰度分佈集中在高值部分,因此整幅圖高亮,第二幅圖的灰度分佈集中在低值部分,整幅圖呈灰暗。
4、直方圖均衡化
將原始影象的直方圖變換為均勻分佈的形式,從而增加畫素灰度值的動態範圍,達到增強影象整體對比度的效果。直方圖均衡是一種非線性變換,以犧牲影象的等級為代價。
實現程式碼如下,
import cv2
import matplotlib.pyplot as plt
import pylab
img = cv2.imread('Lena.jpg',0)
res = cv2.equalizeHist(img) #均衡化
plt.subplot(121),plt.imshow(img,'gray')
plt.subplot(122),plt.imshow(res,'gray')
pylab.show()
均衡化的結果如下,
我們可以看到,均衡化後的影象灰度分佈更加均勻,影象對比度明顯增強。
上述的均衡化方法是全域性上的均衡,有些時候這種操作並不好,會把某些不該調整的部分給調整。Opencv提供另一種區域性調整的均衡化,把整個影象分成許多小塊,每個小塊內部進行均衡化,這種方法叫做對比度受限的自適應直方圖均衡化,對於影象直方圖存在多峰的影象比較適用,實現程式碼如下,
import cv2
import matplotlib.pyplot as plt
import pylab
img = cv2.imread('Lena.jpg',0)
#全域性直方圖均衡化
res = cv2.equalizeHist(img)
#自適應直方圖均衡化
clahe = cv2.createCLAHE(clipLimit=2,tileGridSize=(10,10))#
cl1 = clahe.apply(img)
plt.subplot(121),plt.imshow(res,'gray')
plt.subplot(122),plt.imshow(cl1,'gray')
pylab.show()
兩種均衡化的結果如下,
我們可以看出,相對於全域性均衡化的結果,區域性均衡化的效果更加自然一些。
二、同態增晰
我們之前講到過傅立葉變換,經過傅立葉變換可以得到一幅影象的頻域資訊,我們可以對影象的頻域進行操作達到濾波的目的。頻域中的低頻成分反映灰度的恆定分量,減弱低頻成分可以起到縮小影象灰度範圍的作用;頻域中的高頻成分反映影象的邊界特性,增強高頻成分可以提升影象的對比度(暗區細節增強並保留亮區細節)。
同態增晰是一種在頻域中進行濾波操作的方法,目的是消除影象上照明不均的問題,增加暗區的影象細節,同時又不損失亮區的影象細節,它在頻域中同時將影象亮度範圍進行壓縮和影象對比度進行增強。
同態濾波函式選用高通濾波器,消弱低頻成分,加強高頻成分。
同態增晰的過程如下,
未完待續