OpenCV2鄰域和模板操作

2021-07-03 09:01:35 字數 2962 閱讀 5645

在影象處理中,通過當前位置的鄰域畫素計算新的畫素值是很常見的操作。當鄰域包含影象的上幾行和下幾行時,就需要同時掃瞄影象的若干行,這就是影象的鄰域操作了。至於模板操作是實現空間濾波的基礎,通常是使用乙個模板(乙個的矩形)滑過整幅影象產生新的畫素。下面介紹通過使用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...