影象處理OpenCV演算法01
OpenCV演算法
1、影象的基本操作讀取、顯示、儲存:通過呼叫OpenCV中的cv2.imread(),cv2.imshow(),cv2.write()分別實現。
2、影象由陣列構成,黑白影象就是一個單通道的二維矩陣,如同一個的棋盤(矩陣),棋盤中每個點的數字大小代表著影象畫素灰度的高低,通過畫素的差異形成素描般的黑白影象;而彩色影象則是由三個通道組合而成的一個三維矩陣。彩色影象可以通過b,g,r=cv2.split(image)實現分離,或者通過陣列切分實現通道分離b,g,r=image[:,:,0],image[:,:,1],image[:,:,2];對三個通道的影象合成彩色影象可以呼叫cv2.merge([b,g,r])實現通道合併。
數字影象處理的本質就是操作灰度矩陣。在OpenCV中實現將彩色畫素轉化為灰度畫素的公式:
3、影象的幾何變換,完成一章影象的幾何變換需要兩個獨立的演算法,首先,需要有一個實現空間座標變換,用它描述每個畫素如何從初始位置移動到終止位置;其次,還需要一個插值演算法完成輸出影象的每個畫素的灰度值。
平移公式:
tx>0表示沿x軸正方形移動,反之負方向移動。
縮放公式:
sx>1水平方向上放大,反之縮小;同理sy>1垂直方向放大,反之縮小。
旋轉公式:
α>0,順時針旋轉;反之,逆時針旋轉。通過呼叫cv2.rotate()實現。
通過平移、縮放、旋轉實現影象的空間座標變換,統稱仿射變換。
插值演算法:變換後像素的灰度值等於距它最近的輸入畫素的灰度值
最近鄰插值:(i,j)在第一象限的四個相鄰整數座標為([i],[j]),([i]+1,[j]),([i],[j]+1),([i]+1,[j]+1),其他象限類推,從而找到最接近的一個整數座標代替。例如:(2.3,4.7)的四個相鄰整數座標分別為(2,4)(3,4),(2,5),(3,5)離他最近的整數座標為(2,5)。
雙線性插值:變換後的畫素f(i+u,j+v)由原影象中座標為所對應的周圍四個畫素的值決定。
其中,u=|i-[i]|,v=|j-[j]|,(i,j)與其相鄰整數座標的水平垂直距離。
在OpenCV中通過呼叫cv2.getAffineTransform()函式實現仿射變換的矩陣運算,通過cv2.warpAffine()函式實現影象仿射變換。投影變換矩陣計算, cv2.getPerspectiveTransform()函式實現,通過cv2.warpPerspective()函式實現投影變換功能。
4、對比增強,主要解決由影象的灰度級範圍較小造成的對比度較低的問題,目的就是將輸出影象的灰度級放大到指定的程度,使得影象中的細節看起來更加清晰。常用的有線性變換、直方圖正規化、伽馬變換、全域性直方圖均勻化等。
線性變換:
其中r,c小於影象的高和寬且大於等於0,0<=I(r,c)<=255;當a>1,輸出影象的對比度增大,0<a<1輸出影象的對比度減小;當b>0,亮度增加,反之亮度減小。
分段線性變換是對不同畫素範圍內的值進行不同的線性變換,即把0<=I(r,c)<=255分成多段用多個對應實現線性變換。
主要程式實現:
a=2
b=20
imageout=float(a)*imagein+b
imageout[imageout]=255
imageout=np.round(imageout)
imageout=imageout.astype(np.uint8)
直方圖正規化:
其中Imax,Imin分別為影象灰度級的最大值和最小值,Omax,Omin為輸出影象灰度級的最大值和最小值,I(r,c)為輸入影象。
在OpenCV中直方圖正規化可以直接呼叫cv2.normalize()實現。
伽馬變換:,0<γ<1時增強影象對比度,γ>1時降低影象對比度。
gama的取值為0-1或者大於1
imageout=np.power(imagein,gama)
全域性直方圖均衡化:
histI(k)代表灰度值等於k的畫素點個數,其中k∈[0,255]。
全域性直方圖均衡化步驟:首先計算影象的灰度直方圖;計算灰度直方圖的累加直方圖;根據累加直方圖和直方圖均衡化原理得到輸入灰度級和輸出灰度級之間的對映關係;最後根據第三步得到的灰度級對映關係,迴圈得到輸出影象的每一個畫素的灰度級。