非对称高斯滤波器

时间:2013-03-06 03:26:10

标签: matlab image-processing filtering gaussian

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

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

非常感谢。

4 个答案:

答案 0 :(得分: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'...)

答案 1 :(得分: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),您可以想象歪斜拉伸等...

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

您可以使用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是输出图像。