在影象處理中,通過當前位置的鄰域畫素計算新的畫素值是很常見的操作。當鄰域包含影象的上幾行和下幾行時,就需要同時掃瞄影象的若干行,這就是影象的鄰域操作了。至於模板操作是實現空間濾波的基礎,通常是使用乙個模板(乙個的矩形)滑過整幅影象產生新的畫素。下面介紹通過使用opencv2實現laplace運算元銳化影象,來介紹opencv2中對鄰域和模板的操作。
銳化處理主要的目的是突出灰度的過渡部分,通常由微分來定義和實現銳化運算元的各種方法。laplace運算元是最賤的各向同性微分運算元,常用的laplace模板如下:
使用laplace運算元銳化影象時需要注意模板中心的係數,如果中心係數是負的,就需要將原影象減去經過laplace運算元處理後的影象,得到銳化後的結果。如果中心係數是正的,則相反。
銳化影象時不能以in-place的方式來完成,需要提供乙個輸出影象。在對影象遍歷時使用兩個3個指標:乙個指向當前行,乙個指向當前行的上一行,乙個指向當前行的下一行。而且,由於每個畫素值的計算都需要它的上下左右四個相鄰畫素,所以無法對影象的邊界進行計算,需要另作處理。具體實現**如下:
1:/*
2:0 -1 0
3:-1 4 -1
4:0 -1 0
5:*/
6:void sharpen(const mat & image,mat & result)
7:
22: }
23:
24://對影象邊界進行處理
25://邊界畫素設定為0
26: result.row(0).setto(scalar(0));
27: result.row(result.rows-1).setto(scalar(0)) ;
28: result.col(0).setto(scalar(0));
29: result.col(result.cols-1).setto(scalar(0));
30: }這裡使用指標遍歷整個影象,使用三個指標同時掃瞄影象的三行,另外使用乙個指標指向輸出行。在計算輸出畫素時,使用模板函式saturate_cast對計算結果進行調整。這是因為對畫素值的計算有可能導致結果超出了畫素允許的範圍,即小於0或者大於255,當計算結果是浮點數時,該函式會將結果取整至最近的整數。
由於邊界的畫素沒有完整的鄰域,無法使用模板計算其值,需要單獨處理。這裡只是簡單的將其值設為0.
測試**:
1: mat image = imread("d:\\lenna.jpg") ;
2: mat result ;
3: sharpen(image,result) ;
4: imwrite("d:\\lenna1.jpg",result) ;
5: imwrite("d:\\lenna2.jpg",image + result) ;結果如下:
這裡需要說明,在opencv2中對mat進行了大量的運算子過載,例如上面,兩幅影象相加直接使用image + result即可。另外,如位操作符:&,|,^,~;函式max,min,abs;比較操作符:,>=,比較操作符返回乙個8位二進位制影象。另外矩陣乘法m1 * m2,矩陣求逆 m1.inv(),矩陣轉置m.t(),舉證的行列式m.determinate(),向量的模v.norm(),向量叉乘v.corss(v1),向量的點乘v.dot(v1)等。
由於使用模板實現空間濾波在影象處理中非常的常用,在opencv中專門定義了乙個特殊的函式來完成該處理:
filter2d.
函式原型:
1:引數:void filter2d(inputarray src, outputarray dst, int ddepth, inputarray kernel, point anchor=point(-1,-1), double delta=0, int bordertype=border_default )
src,輸入影象
dst 輸出影象,和輸入影象有相同的大小和通道
ddepth 輸出影象的depth,如果為負數,則和輸入影象的depth相同
kernel 模板
anchor 進行卷積運算的中心位置,預設的是kernel的中心
delta 可選值,加到輸出畫素上的值
bordertype 對輸出影象邊界的處理。
使用filter2d實現laplace運算元
1: mat kern = (mat_ (3,3) << 1,1,1,
2: 1,-8,1,
3: 1,1,1) ;
4: filter2d(image,result,image.depth(),kern) ;
這裡只需要定義好kernel呼叫filter2d即可,而且opencv對該函式進行了優化,其效率要比上面使用指標實現的要高。
**:
OpenCV2鄰域和模板操作
在影象處理中,通過當前位置的鄰域畫素計算新的畫素值是很常見的操作。當鄰域包含影象的上幾行和下幾行時,就需要同時掃瞄影象的若干行,這就是影象的鄰域操作了。至於模板操作是實現空間濾波的基礎,通常是使用乙個模板 乙個的矩形 滑過整幅影象產生新的畫素。下面介紹通過使用opencv2實現laplace運算元銳...
OpenCV2鄰域和模板操作
在影象處理中,通過當前位置的鄰域畫素計算新的畫素值是很常見的操作。當鄰域包含影象的上幾行和下幾行時,就需要同時掃瞄影象的若干行,這就是影象的鄰域操作了。至於模板操作是實現空間濾波的基礎,通常是使用乙個模板 乙個的矩形 滑過整幅影象產生新的畫素。下面介紹通過使用opencv2實現laplace運算元銳...
openCV2 第二講 操作畫素
畫素是的基本元素,所以一張的內容可以用乙個畫素矩陣來表示。畫素矩陣的每個元素代表著乙個畫素,這個元素的型別視情況而定,可以是整型 cv 8u 或者浮點型 cv 32f 還有要注意的是乙個畫素它的通道數,例如,如果是灰度影象的話,它的通道數就是1。對於彩色影象來說的話,就是三個通道了,分別是r,g,b...