非对称高斯滤波器 - 水平和垂直滤波器的不同尺寸和 STD

Posted

技术标签:

【中文标题】非对称高斯滤波器 - 水平和垂直滤波器的不同尺寸和 STD【英文标题】:Asymmetric Gaussian Filter - Different Size and STD for Horizontal and Vertical Filters 【发布时间】:2013-02-20 17:11:54 【问题描述】:

我现在想使用 非对称高斯滤波器内核来使用 MATLAB 平滑图像,因为我不希望垂直和水平的平滑度相同(具有不同大小的高斯模式和不同的标准差)。但我找不到完成这项工作的系统功能。 fspecial()这个函数好像不支持这个。

那么,我该如何实现这个过滤器呢?

非常感谢。

【问题讨论】:

【参考方案1】:

您可以分别应用水平和垂直过滤

v = fspecial( 'gaussian', [11 1], 5 ); % vertical filter
h = fspecial( 'gaussian', [1 5], 2 ); % horizontal
img = imfilter( imfilter( img, h, 'symmetric' ), v, 'symmetric' );

此外,您可以使用外部产品“组合”这两个过滤器

f = v * h; % this is NOT a dot product - this returns a matrix!
img = imfilter( img, f, 'symmetric' );

PS 如果您正在寻找定向过滤,您可能需要考虑fspecial('motion'...)

【讨论】:

f = v * h; 是一个更优雅的解决方案 imfilter 是一个昂贵的操作。我不想有两个。 请注意,'guassian' 应该是 'gaussian' - 显然编辑必须是 6 个字符才能修复它。 'symmteric' 也应该是 'symmetric',抱歉我迟迟没有注意到。【参考方案2】:

您可以使用 fspecial 稍加改动,例如:

 H= fspecial('gaussian',15,2) ;
 H2=imresize(H,[1.5*size(H,1) size(H,2)]);
 Img=conv2(Img,H2,'same');

在过滤器上使用imresize 可以控制高斯的 x 与 y 轴不对称。同样,您可以使用任何类型的图像转换(参见imtransform),您可以想象到倾斜拉伸等...

【讨论】:

不一样,看OP想做什么...我只是演示了一种方式...【参考方案3】:

您可以通过多次应用 Box 过滤器来近似高斯过滤器。由于高斯是可分离的,因此您可以在两个维度上分别执行此操作。一维的盒式过滤器是对线性像素段的简单平均。我对matlab一无所知,但我认为它可以做到这一点。如果 matlab 可以做矩形过滤器,你甚至不需要分离它。

有关近似高斯的更多详细信息,请参阅http://nghiaho.com/?p=1159

【讨论】:

【参考方案4】:

您可以使用 MATLAB 的 conv2() 函数,该函数支持可分离滤波器,并且比 imfilter() 更快。

所以应该是这样的:

v = fspecial( 'gaussian', [11 1], 5 ); % vertical filter
h = fspecial( 'gaussian', [1 5], 2 ); % horizontal
mO = conv2(v, h, mI);

其中mI 是输入图像,mO 是输出。

【讨论】:

以上是关于非对称高斯滤波器 - 水平和垂直滤波器的不同尺寸和 STD的主要内容,如果未能解决你的问题,请参考以下文章

高斯滤波

Canny边缘检测

为啥cv2和skimage之间的高斯滤波器不同?

高斯滤波

sobel和canny

深度学习 吴恩达 Andrew Ng