1. 程式人生 > >影象處理與影象識別筆記(三)影象增強1

影象處理與影象識別筆記(三)影象增強1

影象增強的目的是為了改善影象的視覺效果,為了更便於人或機器的分析和處理,在不考慮影象降質(前提)的情況下,提高影象的可觀性。灰度變換是一種典型的影象增強方法,我們通常把影象處理按照處理方法分成空域方法頻域方法兩類,灰度變換是一種對點處理的空域處理方法。

一、灰度變換

將一個灰度區間對映到另一個灰度區間的變換稱為灰度變換, g ( x ,

y ) = T [ f ( x , y )
] g(x,y) = T[f(x,y)] ,灰度區間是指 0 255 0-255 的灰度值區間, 0
0
是黑色, 255 255 是白色。灰色變換可使影象動態範圍加大,影象對比度擴充套件,影象清晰,特徵明顯。灰度變換可以分為線性變換和非線性變換。
1、線性變換
原始影象: f ( x , y ) f(x,y) ,灰度範圍: [ a , b ] [a,b] ,變換後的影象: g ( x , y ) g(x,y) ,灰度範圍: [ c , d ] [c,d] ,存在以下變換關係:

g ( x , y ) = d c b a [ f ( x , y ) a ] + c g(x,y) =\frac{d-c}{b-a}[f(x,y)-a]+c

2、非線性變換
灰度變換的非線性變換方法包括對數變換和指數變換,對數變換公式為 g ( x , y ) = a + ln [ f ( x , y ) + 1 ] b ln c g(x,y) = a+\frac{\ln[f(x,y)+1]}{b\ln c} ,這個變換擴充套件低灰度區的對比度,壓縮高灰度值。指數變換公式為 g ( x , y ) = b c [ f ( x , y ) a ] 1 g(x,y)=b^{c[f(x,y)-a]}-1 ,與對數變換相反, 指數變換對影象的高灰度區有較大的擴充套件。

線性灰度變換例項如下,

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、灰度直方圖
影象中畫素灰度分佈的概率密度函式,設影象尺寸為 M × N M×N ,共有 K K 級灰度,並且具有灰度級 r k r_k 的畫素數為 g ( r k ) g(r_k) ,則有: p ( r k ) = g ( r k ) M × N p(r_k)=\frac{g(r_k)}{M×N} ,下面我們來計算影象的灰度直方圖。

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()

兩種均衡化的結果如下,

我們可以看出,相對於全域性均衡化的結果,區域性均衡化的效果更加自然一些。

二、同態增晰

我們之前講到過傅立葉變換,經過傅立葉變換可以得到一幅影象的頻域資訊,我們可以對影象的頻域進行操作達到濾波的目的。頻域中的低頻成分反映灰度的恆定分量,減弱低頻成分可以起到縮小影象灰度範圍的作用;頻域中的高頻成分反映影象的邊界特性,增強高頻成分可以提升影象的對比度(暗區細節增強並保留亮區細節)。
同態增晰是一種在頻域中進行濾波操作的方法,目的是消除影象上照明不均的問題,增加暗區的影象細節,同時又不損失亮區的影象細節,它在頻域中同時將影象亮度範圍進行壓縮和影象對比度進行增強。
同態濾波函式選用高通濾波器,消弱低頻成分,加強高頻成分。

同態增晰的過程如下,

未完待續