<分区>
我正在尝试生成可应用于图像的高斯滤波器,但我想将它应用于一维两次:水平和垂直。此外,我想将它分别应用于每个平面。
这意味着我想设计一维高斯滤波器以将其水平应用到红色、绿色、蓝色组件中,然后我使用相同的一维高斯滤波器将其垂直应用到红色、绿色、蓝色组件中。
而且我认为这个操作应该等于在原始彩色图像上应用 2D 高斯滤波器。
我是 Matlab 和图像处理过滤器方面的新手。
<分区>
我正在尝试生成可应用于图像的高斯滤波器,但我想将它应用于一维两次:水平和垂直。此外,我想将它分别应用于每个平面。
这意味着我想设计一维高斯滤波器以将其水平应用到红色、绿色、蓝色组件中,然后我使用相同的一维高斯滤波器将其垂直应用到红色、绿色、蓝色组件中。
而且我认为这个操作应该等于在原始彩色图像上应用 2D 高斯滤波器。
我是 Matlab 和图像处理过滤器方面的新手。
最佳答案
二维高斯卷积可以用两个一维高斯执行:
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
补充阅读:
为什么你更喜欢两个 1D 卷积而不是一个 2D 卷积(也在上面提到的链接 2 中给出):
假设您有一个大小为 MxN
的图像和一个大小为 PxQ
的过滤器,那么对于 2D 卷积,您需要 ~ M*P*N*Q
乘法和加法。对于两个一维滤波器(大小为 P
和 Q
),您只需要 ~ MNP+MNQ = MN(P+Q)
操作。因此,您获得了 PQ/(P+Q)
顺序的加速。
关于image - 水平和垂直一维高斯滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695046/