</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

</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'); grid2.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/

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

被折叠的 条评论
为什么被折叠?



