卷积的表达式:
y(n)=x(n)*h(n)=sigma{x(m)h(n-m)}
y(n)=x(n)*sigma{deta(n-m)} 对应信号系统的卷积冲激函数,系统的结果就是信号和其本身的线性移位
结果元素的个数,x(n)的长度是n,h(n)的长度是m,则结果的序列长度就是n+m-1
和信号处理的过程是一致的,任何一本信号处理的书都有详细的讲解
1.h(n)序列倒置->位移->相乘->取和
举例:x(n) = [4,3,2,1],h(n) = [3,2,1]。
h(n)倒置为h'(n)[1,2,3],逐渐从前向x(n)位移,直到h'(n)最后一个元素3与x(n)第一个元素4接触时,开始相乘,也就是将两个序列相交的元素相乘并求和。
因此x(n)*h(n) = [4×3,2×4+3×3,1×4+2×3+3×2,1×3+2×2+3×1,1×2+2×1,1×1] = [12,17,16,10,4,1]
2.对位相乘求和。
步骤:①两序列右对齐;②逐个元素对应相乘但是不进位;③同列乘值相加
clear;clc;
p=[1 2 3];
q=[1 1];
result1=conv(p,q);
a=[1 1 1];
b=[1 1 1;1 1 1;1 1 1];
result2=conv2(a,b,'full');
result3=conv2(a,b,'same');
result4=conv2(a,b,'valid');
矩阵卷积conv2用于二维矩阵的卷积
也是类似于一维,将较小的那个矩阵旋转180,就是将矩阵翻转,初始矩阵按照两个矩阵大小补零,然后按顺序乘,顺序是从左向右,从上向下,然后相加.
直到没有重叠的部分.
matlab官方的函数讲解如下:
% C = CONVN(A, B, 'shape') controls the size of the answer C:
% 'full' - (default) returns the full N-D convolution
% 'same' - returns the central part of the convolution that
% is the same size as A.
% 'valid' - returns only the part of the result that can be
% computed without assuming zero-padded arrays.
% size(C,k) = max([nak-max(0,nbk-1)],0).
最后,我们可以总结出full,same,valid三种卷积后图像大小的计算公式:
1.full: 滑动步长为1,矩阵大小为n*n,卷积核大小为mxm,卷积后图像大小:(n+m-1) *(n+m-1)
如图, 滑动步长为1,矩阵大小为6*6,卷积核大小为4*4,卷积后图像大小:10*10
2.same: 滑动步长为1,矩阵大小为n*n,卷积核大小为mxm,卷积后图像大小:n*n
3.valid:滑动步长为S,矩阵大小为n*n,卷积核大小为mxm,卷积后图像大小:(n-m)/S+1 *(n-m)/S+1
步骤:1
2:
3:
本文参考文章:https://www.cnblogs.com/hyb221512/p/9276621.html and https://www.cnblogs.com/dasein/p/5692153.html