所以我将高斯核应用于超声图像,由0到255范围内的整数值组成,如下所示
filteredImage = imfilter(image,kernel,'conv','same')
使用imshow(filteredImage
)我得到了一个非常模糊的图像:
然后,改为使用
convImage = conv2(image,kernel,'same')
我得到以下图片
使用这种方式的这两个函数不应该产生相同类型的输出吗?
答案 0 :(得分:2)
imfilter
和conv2
不完全相同(imfilter就像conv2
,过滤器被翻转)。如果你使用'conv',那么它们是相同的。
首先,您可以使用imfilter以另一种方式检查您是否正在使用正确的图像类型。检查一下:
out1=conv2(double(image),kernel,'same');
out_conv=uint8(out1);
old_imfilter=imfilter(image,kernel,'same');
new_imfilter=imfilter(image,kernel(end:-1:1,end:-1:1),'same');
new_imfilter
和out_conv
应该相同。如果是这样,您可以使用您的方法:
convImage = uint8(conv2(double(image),kernel,'same'));
filteredImage = imfilter(image,kernel,'conv','same');
现在filteredImage
和convImage
应该相同。
答案 1 :(得分:2)
以这种方式使用imfilter
和conv2
之间的差异是conv2
执行转换为double
...
varargin{k} = double(varargin{k});
...虽然imfilter
没有。
uint8
类型的图像的范围为[0,255],而类型double
的图像的范围通常为[0,1]。 imshow
在这些假设下工作,因此,如果通过double
图片,则会将大于1的任何值显示为白色。
由于原始图片为uint8
,调用conv2
后的结果仍会包含[0,255]范围内的值(尽管已转换为double
),因此不会显示正确地imshow
。许多修复(一些已经建议):
imshow
检测范围:imshow(convImage,[])
imshow(convImage/255)
uint8
:imshow(uint8(convImage))