📜  MATLAB中的卷积形状(完整/相同/有效)

📅  最后修改于: 2022-05-13 01:55:07.709000             🧑  作者: Mango

MATLAB中的卷积形状(完整/相同/有效)

卷积是一种数学运算。它用于 MatLab 中的图像处理。掩码/过滤器用于对图像进行卷积以进行图像检测。但是 MatLab 提供了三种类型的卷积。这里我们将解释简单的卷积。

过滤器从左到右在图像矩阵上滑动。矩阵和过滤器的对应值相乘相加。滤波器中心值下的矩阵值被卷积运算的结果代替。

根据在矩阵上滑动的滤波器的性质,MatLab 具有三种不同类型的卷积。

示例 1:

Given an image matrix: 
                      1st row->[1 2 4]
                      2nd row->[2 1 3]
                      3rd row->[3 2 1]
   Given filter: 
                     1st row->[1 0 1]
                     2nd row->[1 0 1]
                     3rd row->[1 0 1] 
                      
Here we are going to apply the 'same' convolution. 
 The resultant matrix is:[3 10 3]
                        [5 14 5]
                        [3  9 3]
                        

相同的卷积

现在我们看到了相同的卷积。所以在这种类型的卷积中,结果矩阵的大小与输入矩阵的大小相同。过滤器/遮罩的中心放置在第一行的第一个元素上。然后过滤器从左到右在矩阵上滑动。一旦覆盖了一行,过滤器就会向下滑动到下一行,并从左侧移动到右侧。当过滤器挂在矩阵之外时,矩阵用 0 填充。

注意:输出矩阵的大小=输入矩阵的大小。

示例 1:平均卷积

Matrix (3, 4): 
1st row->[1     5     2     3]
2nd row->[6     7    10     2]
3rd row->[8     4    10     6]

Averaging Filter (3, 3): 
 1st row->[0.1111    0.1111    0.1111]
 2nd row->[0.1111    0.1111    0.1111]
 3rd row->[0.1111    0.1111    0.1111]
 
Same Convolution result (3, 4):
 1st row->[2.1111    3.4444    3.2222    1.8889]
 2nd row->[3.4444    5.8889    5.4444    3.6667]
 3rd row->[2.7778    5.0000    4.3333    3.1111]

示例 2:正常卷积

Matrix (3, 4):
Row1->[1     5     2     3]
Row2->[6     7    10     2]
Row3->[8     4    10     6]
Normal Filter (3,3):
Row1->[1     1     1]
Row2->[0     0     0]
Row3->[-1   -1    -1]
Same Convolution result: 
Row1->[13    23    19    12]
Row2->[6     14    10    11]
Row3->[-13  -23   -19   -12]

让我们以相同卷积为例,并在其上应用掩码,

例子:

Matlab
% MATLAB code for Same Convolution
% Matrix initialisation;
  K = [1     5     2     3; 
     6     7    10     2;
     8     4    10     6];
% Averaging mask creation
  mask1=ones(3,3).*1/9;
  
% Result-1
  R1=conv2(K,mask1,'same');
  
% Random mask 
  mask2=[1     1     1;
         0     0     0;
        -1   -1    -1];
% Result-2
  R2=conv2(K,mask2,'same');
  
% Show matrix-K, mask1 and result-1
  K
  mask1
  R1
  
% Show matrix-K, mask2 and result-2
  K
  mask2
  R2


Matlab
% MATLAB code for 
% Valid convolution.
% Define matrix -1
  matrix1 =[1 2 4 3;
         2 1 3 5; 
         3 2 1 6; 
         2 3 4 9];
           
% Define mask1
  mask1=[1 1 1; 
       0 0 0;
       1 1 1];
         
% Apply valid convolution.
  result1=conv2(matrix1,mask1,'valid'); 
  
% Show matrix, mask and result.
  matrix1 
  mask1
  result1
  
% Define mat-2
  matrix2=[1     5     2     3;
           6     7    10     2;
           8     4    10     6];
% Define mask2
  mask2=[1 1 1; 
         0 0 0; 
       -1 -1 -1];
% Apply valid convolution.
  result2=conv2(matrix2,mask2,'valid');
  
% Show matrix, mask and result.
  matrix2
  mask2
  result2


Matlab
% MATLAB code of 
% FULL convolution.
% Define mat-1
  matrix1=[1 2 4 3;
           2 1 3 5;
           3 2 1 6;
           2 3 4 9];
           
% Define mask1
  mask1=[1 0 1; 
         0 1 0;
         1 0 1];
         
% Apply FULL convolution.
  result1=conv2(matrix1,mask1,'full'); 
  
% Show matrix, mask and result.
  matrix1 
  mask1
  result1
  
% Define mat-2
  matrix2=[1     5     2     3; 
         6     7    10     2; 
         8     4    10     6];
           
% Define mask2
  mask2=[1 1 1; 
       0 0 0; 
       -1 -1 -1];
         
% Apply FULL convolution.
  result2=conv2(matrix2,mask2,'full');
  
% Show matrix, mask and result.
  matrix2
  mask2
  result2


输出 1:

输出 2:

有效卷积

在这种类型的卷积中,结果矩阵的大小会减小。过滤器/面罩放置在矩阵上,这样过滤器的任何部分都不会悬空。过滤器完全悬停在矩阵上,然后在行中从左到右滑动,在列中从上到下滑动。

Size of resultant matrix: Size of matrix = N * N Size of filter = n * n Size of output = (N-n+1) * (N-n+1) If the matrix and filter are of 3 * 3 size, then  result matrix will be 1*1.

例子:

Matrix (3, 4):  
Row 1->[1     5     2     3]
Row 2->[6     7    10     2]
Row 3->[8     4    10     6]

Filter (3,3):      
Row 1->[1     1     1]
Row 2->[0     0     0]
Row 3->[-1   -1    -1] 

Valid Convolution result:
[14    10]

Number of rows in output matrix = (3 - 3 + 1) = 1
Number of columns in output matrix = (4 - 3 + 1) = 2

例子:

MATLAB

% MATLAB code for 
% Valid convolution.
% Define matrix -1
  matrix1 =[1 2 4 3;
         2 1 3 5; 
         3 2 1 6; 
         2 3 4 9];
           
% Define mask1
  mask1=[1 1 1; 
       0 0 0;
       1 1 1];
         
% Apply valid convolution.
  result1=conv2(matrix1,mask1,'valid'); 
  
% Show matrix, mask and result.
  matrix1 
  mask1
  result1
  
% Define mat-2
  matrix2=[1     5     2     3;
           6     7    10     2;
           8     4    10     6];
% Define mask2
  mask2=[1 1 1; 
         0 0 0; 
       -1 -1 -1];
% Apply valid convolution.
  result2=conv2(matrix2,mask2,'valid');
  
% Show matrix, mask and result.
  matrix2
  mask2
  result2

输出 1:

输出 2:

全卷积

在这种类型的卷积中,

  • 过滤器的第一个右下角将悬停在矩阵的左上角元素。他们的产品将被计算。其余的过滤器元素将乘以 0,因为默认情况下矩阵用 0 填充。如果我们使用平均滤波器,则将计算乘积的平均值。
  • 过滤器的底行将从左向右滑过矩阵。当过滤器底行的最左侧元素悬停在矩阵第一行的最右侧元素时,将计算第一行中的最后一个操作。
  • 因此,在滑动第一行后,过滤器将下降一步,并再次重复相同的步骤。
  • 过滤器将滑动,直到其第一(顶)行悬停在矩阵的最后(底)行。然后将从左向右滑动,直到过滤器的最左侧元素悬停在矩阵最后一行的最右侧元素上。

The size of resultant matrix: Size of matrix = N * N Size of filter = n * n Size of output = (N+n-1) * (N+n-1) If the matrix is 5*5 and filter is 3 * 3 size, then result matrix will be 7*7.

示例 1:

Input matrix: 
            1st row->[1 2 4 3]
            2nd row->[2 1 3 5]
            3rd row->[3 2 1 6]
            4th row->[2 3 4 9]
Filter:           
            1st row->[1 0 1]
            2nd row->[0 1 0]
            3rd row->[1 0 1]
Resultant matrix:
           1st row->[1 2 5 5 4 3]
           2nd row->[2 2 7 10 6 5]
           3rd row->[4 6 10 16 10 9]
           4th row->[4 7 13 19 13 14]
           5th row->[3 4 7 12 10 6]
           6th row->[2 3 6 12 4 9]

示例 2:

Matrix (3, 4):
[1     5     2     3]
[6     7    10     2]
[8     4    10     6]

Filter (3,3):
[1     1     1]
[0     0     0]
[-1    -1    -1]

Full convolution result:
[1     6     8    10     5     3]
[6    13    23    19    12     2]
[7     6    14    10    11     3]
[-6   -13   -23   -19   -12   -2]
[-8   -12   -22   -20   -16   -6]
Rows = (3 + 3 -1) = 5
Columns = (4 + 3 - 1) = 6

例子:

MATLAB

% MATLAB code of 
% FULL convolution.
% Define mat-1
  matrix1=[1 2 4 3;
           2 1 3 5;
           3 2 1 6;
           2 3 4 9];
           
% Define mask1
  mask1=[1 0 1; 
         0 1 0;
         1 0 1];
         
% Apply FULL convolution.
  result1=conv2(matrix1,mask1,'full'); 
  
% Show matrix, mask and result.
  matrix1 
  mask1
  result1
  
% Define mat-2
  matrix2=[1     5     2     3; 
         6     7    10     2; 
         8     4    10     6];
           
% Define mask2
  mask2=[1 1 1; 
       0 0 0; 
       -1 -1 -1];
         
% Apply FULL convolution.
  result2=conv2(matrix2,mask2,'full');
  
% Show matrix, mask and result.
  matrix2
  mask2
  result2

输出 1:

输出 2: