5

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

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

非常感谢。

4

4 回答 4

7

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

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'...)

于 2013-03-06T07:11:53.433 回答
5

您可以使用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),您可以想象到倾斜拉伸等...

于 2013-03-06T04:32:41.843 回答
3

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

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

于 2013-03-06T04:15:40.067 回答
1

您可以使用 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,输出在哪里。

于 2019-10-17T23:33:29.340 回答