1D高斯滤波器水平和垂直

时间:2014-11-02 01:16:52

标签: image matlab image-processing gaussian

我正在尝试生成可应用于图像的高斯滤镜,但我想将其应用于1D两次:水平和垂直。另外,我想分别将它应用到每个飞机上。

这意味着我想设计一维高斯滤波器将其水平应用于红色,绿色,蓝色分量,然后我有相同的1D高斯滤波器将其垂直应用于红色,绿色,蓝色分量。

我认为此操作应该等于在原始彩色图像上应用2D高斯滤镜。

我是Matlab和图像处理过滤器的新手。

1 个答案:

答案 0 :(得分:8)

2D高斯卷积可以用两个1D高斯执行:

G(x,y)*I=G(x)*(G(y)*I);

您可以在MATLAB中执行以下操作:

img=im2double(imread('cameraman.tif'));

yourFilterSize=[3 5] %3 rows, 5 columns, can be anything

%two 1D Gaussians
g_x=fspecial('gaussian',[1 yourFilterSize(2)]);
g_y=fspecial('gaussian',[yourFilterSize(1) 1]);

%applying 1D gaussian in X-direction to the original image
img_X=imfilter(img,g_x);

%applying 1D gaussian in Y-direction to img_X
img_XY=imfilter(img_X,g_y);  %DONE

%verifying that the result is correct
g_xy=fspecial('gaussian',yourFilterSize);
img_XY2D=imfilter(img,g_xy);
max(max(abs(img_XY-img_XY2D)))  %this should be very small, 
                                %of the order of machine precision
                                %for the result to be correct

补充阅读:

  1. This回答Stackoverflow.com,它向您展示如何确定给定内核是否可分离。例如,Gaussian是可分离的,而磁盘内核则不是。
  2. Original article针对上述问题。

  3. 为什么你更喜欢两个1D卷积而不是一个2D卷积(也在上面提到的链接2中给出):

    假设您有一个大小为MxN的图片和一个大小为PxQ的过滤器,那么对于2D卷积,您需要~ M*P*N*Q次乘法和加法。对于两个1D过滤器(大小为PQ),您只需要~ MNP+MNQ = MN(P+Q)次操作。因此,您获得了PQ/(P+Q)

    的加速