基于这个问题和这个问题,我认为“imfilter”和“conv2”应该有相同的结果。但试试这个代码,你会看到不同之处。问题是什么?
I = imread('tire.tif');
fil=[1 2 3;4 5 6;7 8 9];
out1=conv2(double(I),fil,'same');
out2=uint8(out1);
out3=imfilter(I,fil,'same');
如果您使用imfilter(I,fil,'same','conv')
,那么它们是相同的。
不同之处在于,imfilter默认使用correlation来过滤图像,这有一些小的差异——基本上,卷积从图像的一侧开始,而correlation从另一侧开始,所以过滤器输出有一些小的差异。如果你先翻转图像,你会得到相同的输出:
out4=fliplr(flipud(imfilter(fliplr(flipud(I)),fil,'same')));
这正好等于out2。
您的答案在于对 imfilter 的第四个输入参数的解释。
- 相关和卷积
'corr' imfilter performs multidimensional filtering using
correlation, which is the same way that FILTER2
performs filtering. When no correlation or
convolution option is specified, imfilter uses
correlation.
'conv' imfilter performs multidimensional filtering using
convolution.
试一试out3=imfilter(I,fil,'same','conv');
,你会得到与conv2
.