卷積核的理解

2021-09-12 02:00:50 字數 3981 閱讀 8116

數字訊號處理中卷積

卷積一詞最開始出現在訊號與線性系統中,訊號與線性系統中討論的就是訊號經過乙個線性系統以後發生的變化。由於現實情況中常常是乙個訊號前一時刻的輸出影響著這一時刻的輸出,所在一般利用系統的單位響應與系統的輸入求卷積,以求得系統的輸出訊號(當然要求這個系統是線性時不變的)。 

卷積的定義: 

卷積是兩個變數在某範圍內相乘後求和的結果。如果卷積的變數是序列x(n)和h(n),則卷積的結果: 

數字影象處理中卷積

數字影象是乙個二維的離散訊號,對數字影象做卷積操作其實就是利用卷積核(卷積模板)在影象上滑動,將影象點上的畫素灰度值與對應的卷積核上的數值相乘,然後將所有相乘後的值相加作為卷積核中間畫素對應的影象上畫素的灰度值,並最終滑動完所有影象的過程。 

這張圖可以清晰的表徵出整個卷積過程中一次相乘後相加的結果:該選用3*3的卷積核,卷積核內共有九個數值,所以右上角公式中一共有九行,而每一行都是影象畫素值與卷積核上數值相乘,最終結果-8代替了原影象中對應位置處的1。這樣沿著一步長為1滑動,每乙個滑動後都一次相乘再相加的工作,我們就可以得到最終的輸出結果。除此之外,卷積核的選擇有一些規則: 

1)卷積核的大小一般是奇數,這樣的話它是按照中間的畫素點中心對稱的,所以卷積核一般都是3x3,5x5或者7x7。有中心了,也有了半徑的稱呼,例如5x5大小的核的半徑就是2。 

2)卷積核所有的元素之和一般要等於1,這是為了原始影象的能量(亮度)守恆。其實也有卷積核元素相加不為1的情況,下面就會說到。 

3)如果濾波器矩陣所有元素之和大於1,那麼濾波後的影象就會比原影象更亮,反之,如果小於1,那麼得到的影象就會變暗。如果和為0,影象不會變黑,但也會非常暗。 

4)對於濾波後的結構,可能會出現負數或者大於255的數值。對這種情況,我們將他們直接截斷到0和255之間即可。對於負數,也可以取絕對值。

邊界補充問題

上面的說明了影象的卷積操作,但是他也反映出乙個問題,如上圖,原始尺寸為7*7,卷積核的大小為3*3,當卷積核沿著滑動後只能滑動出乙個5*5的出來,這就造成了卷積後的和卷積前的尺寸不一致,這顯然不是我們想要的結果,所以為了避免這種情況,需要先對原始做邊界填充處理。在上面的情況中,我們需要先把原始影象填充為9*9的尺寸。 

常用的區域填充方法包括: 

為了畫圖方便,這裡就不用5*5的尺寸了,用3*3定義原始影象的尺寸,補充為9*9的尺寸,上的顏色只為方便**,並沒有任何其他含義。 

原始影象:

補零填充

邊界複製填充

映象填充

塊填充以上四種邊界補充方法通過看名字和就能理解了,不在多做解釋。

不同卷積核下卷積意義

我們經常能看到的,平滑,模糊,去燥,銳化,邊緣提取等等工作,其實都可以通過卷積操作來完成,下面我們一一舉例說明一下:

乙個沒有任何作用的卷積核:

卷積核: 

將原畫素中間畫素值乘1,其餘全部乘0,顯然畫素值不會發生任何變化。

平滑均值濾波:

選擇卷積核: 

該卷積核的作用在於取九個值的平均值代替中間畫素值,所以起到的平滑的效果: 

高斯平滑:

卷積核: 

高斯平滑水平和垂直方向呈現高斯分布,更突出了中心點在畫素平滑後的權重,相比於均值濾波而言,有著更好的平滑效果。 

影象銳化:

卷積核: 

該卷積利用的其實是影象中的邊緣資訊有著比周圍畫素更高的對比度,而經過卷積之後進一步增強了這種對比度,從而使影象顯得稜角分明、畫面清晰,起到銳化影象的效果。 

除了上述卷積核,邊緣銳化還可以選擇: 

梯度prewitt:

水平梯度卷積核: 

垂直梯度卷積核: 

梯度prewitt卷積核與soble卷積核的選定是類似的,都是對水平邊緣或垂直邊緣有比較好的檢測效果。

soble邊緣檢測:

soble與上述卷積核不同之處在於,soble更強調了和邊緣相鄰的畫素點對邊緣的影響。 

水平梯度: 

垂直梯度: 

以上的水平邊緣與垂直邊緣檢測問題可以參考:soble運算元水平和垂直方向導數問題

梯度laplacian:

卷積核: 

laplacian也是一種銳化方法,同時也可以做邊緣檢測,而且邊緣檢測的應用中並不侷限於水平方向或垂直方向,這是laplacian與soble的區別。下面這張圖可以很好的表徵出二者的區別:**於opencv官方文件 

opencv實現

可以利用opencv提供的filter2d函式完成對影象進行卷積操作,其函式介面為:

cv_exports_w void filter2d(

inputarray src, 

outputarray dst, 

int ddepth,

inputarray kernel, 

point anchor=point(-1,-1),

double delta=0, 

int bordertype=border_default );12

3456

78第乙個引數: 輸入影象 

第二個引數: 輸出影象,和輸入影象具有相同的尺寸和通道數量 

第三個引數: 目標影象深度,輸入值為-1時,目標影象和原影象深度保持一致。 

第四個引數: 卷積核,是乙個矩陣 

第五個引數:核心的基準點(anchor),其預設值為(-1,-1)說明位於kernel的中心位置。基準點即kernel中與進行處理的畫素點重合的點。 

第五個引數: 在儲存目標影象前可選的新增到畫素的值,預設值為0 

第六個引數: 畫素向外逼近的方法,預設值是border_default。

#include

#include

#include

#include

#include

using namespace std;

using namespace  cv;

int main()12

3456

78910

1112

1314

1516

1718

1920

2122

2324

所以**的實現就非常簡單了,不同的卷積操作只需要改變卷積核kernel 即可。

手寫卷積操作

這個自己實現的卷積其實也依賴opencv,但是沒有直接使用封裝好的函式,這樣更有利於了解影象卷積到底是如何完成的。這裡面加了乙個防溢位的函式,具體可以看聊一聊opencv的saturate_cast防溢位。

#include

#include

#include

using namespace  std;

using namespace  cv;

mat kernel_test_3_3 = (mat_(3,3) << 

0,-1,0,

-1,5,-1,

0,-1,0);

void convlution(mat  inputimage,mat  outputimage,mat kernel)

}outputimage.at(image_y+sub_y,image_x+sub_x) = (uchar)pix_value;

= saturate_cast((int)pix_value);

if ((int)pix_value!=(int)saturate_cast((int)pix_value))12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

4142

4344

4546

4748

4950

5152

5354

5556

5758

5960

6162

6364

6566

67

卷積核的理解和引數確定

卷積核相當於是乙個滑動視窗,一般像我們看到的3x3的卷積核就是指覆蓋3x3畫素的乙個滑動視窗,對於單個kernal size中的卷積核,滑動視窗3x3中的9個引數都是公用的,來處理乙個通道的輸入資料,比如 一般都是rgb三層,畫素大小為224x224,那個乙個輸入的大小為224x224x3,然後通過...

關於卷積核為何有效的初級理解

傳統的神經網路mlp和其他的淺層演算法如svm等,是把一張影象先拉直再輸入,後續也都處於一維的狀態。而一張rgb影象共有9個維度的資訊,分別是rgb值和對應的位置 r g b xr yr xg yg xb yb。mlp丟失了其中絕大部分的位置資訊,在僅有的rgb值3個維度的資訊去解決9個維度的問題,...

卷積核引數的計算及1 1卷積核

首先,明確乙個概念 卷積並不只是乙個二維的過程,實際上對於輸入的一般而言是三個通道的 r g b 那為什麼輸出的結果可以是128個通道呢?實際上經過卷積過後的通道數是由卷積核的個數來決定的,整個的卷積過程二維情況下也就是在每個通道下發生的卷積過程為 在多通道情況下的卷積情況如下 其實濾波器的維度應該...