MATLAB卷積運算(conv、conv2、convn)解釋


1

conv(向量卷積運算)

所謂兩個向量卷積,說白了就是多項式乘法。
比如:p=[1 2 3],q=[1 1]是兩個向量,p和q的卷積如下:
把p的元素作為一個多項式的系數,多項式按升冪(或降冪)排列,比如就按升冪吧,寫出對應的多項式:1+2x+3x^2;同樣的,把q的元素也作為多項式的系數按升冪排列,寫出對應的多項式:1+x。

卷積就是“兩個多項式相乘取系數”。
(1+2x+3x^2)×(1+x)=1+3x+5x^2+3x^3
所以p和q卷積的結果就是[1 3 5 3]。

記住,當確定是用升冪或是降冪排列后,下面也都要按這個方式排列,否則結果是不對的。
你也可以用matlab試試
p=[1 2 3]
q=[1 1]
conv(p,q)
看看和計算的結果是否相同。


conv2(二維矩陣卷積運算)

a=[1 1 1;1 1 1;1 1 1];
b=[1 1 1;1 1 1;1 1 1];
>> conv2(a,b)

ans =

     1     2     3     2     1
     2     4     6     4     2
     3     6     9     6     3
     2     4     6     4     2
     1     2     3     2     1

>> conv2(a,b,'valid')

ans =

     9

>> conv2(a,b,'same')

ans =

     4     6     4
     6     9     6
     4     6     4

>> conv2(a,b,'full')

ans =

     1     2     3     2     1
     2     4     6     4     2
     3     6     9     6     3
     2     4     6     4     2
     1     2     3     2     1


convn(n維矩陣卷積運算)

 

>> a=ones(5,5,5)

a(:,:,1) =

     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1

a(:,:,2) =

     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1

a(:,:,3) =

     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1

a(:,:,4) =

     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1

a(:,:,5) =

     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1
     1     1     1     1     1

>> b=ones(5,5,5);

>> convn(a,b,'valid')

ans =

   125

>> convn(a,b,'same')

ans(:,:,1) =

    27    36    45    36    27
    36    48    60    48    36
    45    60    75    60    45
    36    48    60    48    36
    27    36    45    36    27

ans(:,:,2) =

    36    48    60    48    36
    48    64    80    64    48
    60    80   100    80    60
    48    64    80    64    48
    36    48    60    48    36

ans(:,:,3) =

    45    60    75    60    45
    60    80   100    80    60
    75   100   125   100    75
    60    80   100    80    60
    45    60    75    60    45

2

1.full

 

如下圖:

 

 

                                  圖(1)

 

 圖中藍色為原圖像,白色為對應卷積所增加的padding,通常全部為0,綠色是卷積后圖片。圖的卷積的滑動是從卷積核右下角與圖片左上角重疊開始進行卷積,滑動步長為1,卷積核的中心元素對應卷積后圖像的像素點。

 

2.same

 

如下圖:

 

 

                                                               圖(2)

 

卷積的時候需要對卷積核進行180的旋轉,同時卷積核中心與需計算的圖像像素對齊,輸出結構為中心對齊像素的一個新的像素值

 

3. valid

 

如下圖:

 

 

                                                           圖(3)

 

太簡單,不解釋。

 

 

 

 

 

最后,我們可以總結出full,same,valid三種卷積后圖像大小的計算公式:

 

1.full: 滑動步長為1,圖片大小為N1xN1,卷積核大小為N2xN2,卷積后圖像大小:N1+N2-1 x N1+N2-1

 

如圖1, 滑動步長為1,圖片大小為2x2,卷積核大小為3x3,卷積后圖像大小:4x4

 

2.same: 滑動步長為1,圖片大小為N1xN1,卷積核大小為N2xN2,卷積后圖像大小:N1xN1

 

3.valid:滑動步長為S,圖片大小為N1xN1,卷積核大小為N2xN2,卷積后圖像大小:(N1-N2)/S+1 x (N1-N2)/S+1

 

如圖2,滑動步長為1,圖片大小為5x5,卷積核大小為3x3,卷積后圖像大小:3x3
 
3
MATLAB的conv2函數實現步驟(conv2(A,B)):

其中,矩陣A和B的尺寸分別為ma*na即mb*nb

① 對矩陣A補零,第一行之前和最后一行之后都補mb-1行,第一列之前和最后一列之后都補nb-1列(注意conv2不支持其他的邊界補充選項,函數內部對輸入總是補零);

② 將卷積核繞其中心旋轉180度;

③ 滑動旋轉后的卷積核,將卷積核的中心位於圖像矩陣的每一個元素,並求乘積和(即將旋轉后的卷積核在A上進行滑動,然后對應位置相乘,最后相加);下面分別是shape=full, same, valid時取輸出圖像大小的情況,其中:位置1表示輸出圖像的值從當前核的計算值開始(對應輸出圖像左上角),位置2表示到該位置結束(對應輸出圖像右下角)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM