Matlab 几种卷积的实现与比较(conv与filter,conv2与filter2,imfilter)

本文详细介绍了 Matlab 中的卷积函数,包括 filter 和 conv 的使用,以及它们在处理序列时的相同点和不同点。同时,文章还探讨了二维卷积函数 conv2 和 filter2 的应用,并提到了 fspecial 和 imfilter 在图像处理中的作用。

</pre><pre name="code" class="cpp">
</pre></h1><h1><span style="font-size:18px;">1 filter</span></h1><span style="font-size:14px">y=filter(p,d,x)用来实现差分方程,d表示差分方程输出y的系数,p表示输入x的系数,而x表示输入序列。输出结果长度数等于x的长度。</span><p></p><p></p><p><span style="color:rgb(85,85,85)">实现差分方程,先从简单的说起:</span><span style="color:rgb(85,85,85)"></span><span style="color:rgb(85,85,85)">filter([1,2],1,[1,2,3,4,5]),实现y[k]=x[k]+2*x[k-1]</span><span style="color:rgb(85,85,85)"></span><span style="color:rgb(85,85,85)">y[1]=x[1]+2*0=1    (x[1]之前状态都用0)</span><span style="color:rgb(85,85,85)"></span><span style="color:rgb(85,85,85)">y[2]=x[2]+2*x[1]=2+2*1=4</span></p><p><span style="color:rgb(85,85,85)">以此类推......</span></p><h1><span style="color: rgb(85, 85, 85);"><span style="font-size:18px;">2 conv</span></span></h1><p><span style="color: rgb(85, 85, 85);">y=conv(x,h)</span><span style="color:rgb(85,85,85)">是用来实现卷级的,对x序列和h序列进行卷积,输出的结果个数等于x的长度与h的长度之和减去1。</span></p><p><span style="color:rgb(85,85,85)">卷积公式:z(n)=x(n)*y(n)= ∫x(m)y(n-m)dm.</span></p><h2><span style="color:rgb(85,85,85)"> <span style="font-size:18px;">2.1 </span></span><span style="color: rgb(85, 85, 85);"><span style="font-size:18px;">Filter与conv相同点</span></span></h2><p>h = [3 2 1 -2 1 0 -4 0 3]; % impulse response</p><pre name="code" class="cpp">x = [1 -2 3 -4 3 2 1]; % input sequence
y = conv(h,x);
n = 0:14;
subplot(2,1,1);
stem(n,y);
xlabel('Time index n'); ylabel('Amplitude');
title('Output Obtained by Convolution'); grid;
x1 = [x zeros(1,8)];
y1 = filter(h,1,x1);
subplot(2,1,2);
stem(n,y1);
xlabel('Time index n'); ylabel('Amplitude');
title('Output Generated by Filtering'); grid

2.2 filter与conv不同

  

x=[1,2,3,4,5];
h=[1,1,1];
y1=conv(h,x)
y2=filter(h,1,x)
y3=filter(x,1,h)
y1 = 1     3     6     9    12     9     5
y2 = 1     3     6     9    12
‍y3 = 1     3     6  

可见:filter函数y(n)是从n=0开始,认为所有n<0都为0;而conv是从卷积公式计算,包括n<0部分。

           因此filter conv 的结果长短不同

 3 conv2

C = conv2(A,B) 
C = conv2(A,B)返回矩阵A和B的二维卷积C。若A为ma×na的矩阵,B为mb×nb的矩阵,则C的大小为(ma+mb-1)×(na+nb-1)。 

y= conv2(im, m, 'valid')的等效代码如下:        

 %第一种
[nxr, nxc] = size(im);     % nxr: number of im rows, etc.
[nmr, nmc] = size(m);
nyr = nxr - nmr + 1;      % get valid output region
nyc = nxc - nmc + 1;
y1 = zeros(nyr, nyc);      % preallocate output array
tic
for yr = 1:nyr            % loop over output elements
    for yc = 1:nyc
        sum = 0;
        for mr = 1:nmr    % loop over mask elements
            for mc = 1:nmc
                sum = sum + im(yr-mr+nmr, yc-mc+nmc) * m(mr, mc);
            end
        end
        y1(yr, yc) = sum;  % store result
    end
end
%第二种

[nxr, nxc] = size(im);     % nxr: number of im rows, etc.
[nmr, nmc] = size(m);
nyr = nxr - nmr + 1;       % get valid output region
nyc = nxc - nmc + 1;
y2 = zeros(nyr, nyc);      % preallocate output array
for mr = 1:nmr              % loop over mask elements
    for mc = 1:nmc
        xpart = im(nmr-mr+1:nxr-mr+1, nmc-mc+1:nxc-mc+1);
        y2 = y2 + xpart * m(mr, mc);
    end
end

4 filter2

Y = filter2(h,X) 

其中Y = filter2(h,X)返回图像X经算子h滤波后的结果,默认返回图像Y与输入图像X大小相同。例如: 
其实filter2和conv2是等价的。MATLAB在计算filter2时先将卷积核旋转180度,再调用conv2函数进行计算。 

 5 fspecial

fspecial函数用于创建预定义的滤波算子,其语法格式为: 
h = fspecial(type) 
h = fspecial(type,parameters) 
参数type制定算子类型,parameters指定相应的参数,具体格式为: 
type='average',为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]。 
type= 'gaussian',为高斯低通滤波器,参数有两个,n表示模版尺寸,默认值为[3,3],sigma表示滤波器的标准差,单位为像素,默认值为0.5

6 imfilter

B = imfilter(A, H)

B = imfilter(A, H, option1, option2,...)

imfiler函数在默认的情况下,对图像的滤波计算用的是相关

下面是一个简单的例子展示了使用相同的高斯滤波核函数,相关运算和卷积运算对图像平滑的效果可以直接后边附的程序查看。

由结果可以看出相关运算和卷积运算的在用于图像平滑滤波时效果差别不大。当模板大小N>50的时候,边界的系数已经非常小,对运算起到的作用和微乎其微。

所以平滑的结果差别已经非常细微,肉眼几乎难以察觉。

example.m
clear all
I = imread('lena.bmp');
Img = double(I);
alf=3;
n=10;%定义模板大小
n1=floor((n+1)/2);%计算中心
for i=1:n
for j=1:n
b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*alf))/(4*pi*alf);
end
end
Img_n = uint8(conv2(Img,b,'same')); 
K=uint8(imfilter(Img,b));
Img_n2=uint8(imfilter(Img,b,'conv'));
J=(Img_n2)-Img_n;
flag=mean(J(:))
subplot(131),imshow(I);title('原图')
subplot(132),imshow(Img_n);title('卷积运算图')
subplot(133),imshow(K);title('相关运算图')
figure(2),surf(b);


 

 

 

 

 

资料来源:

http://www.cnblogs.com/xfzhang/archive/2011/01/18/1938004.html

http://anony3721.blog.163.com/blog/static/5119742011102510105137/

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值