【问题标题】:1D Gaussian filter horizontally and vertically [duplicate]水平和垂直一维高斯滤波器[重复]
【发布时间】:2014-11-02 10:37:09
【问题描述】:

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

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

我认为这个操作应该等同于在原始彩色图像上应用 2D 高斯滤波器。

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

【问题讨论】:

  • paisanco 我看到了这篇文章......它对我没有帮助......因为我想在 matlab 中使用 fspecial ,imfilter , conv 函数
  • 很公平,但如果您有图像处理工具箱,我不确定问题是什么,这些功能的 Matlab 文档中是否有某些方面未涵盖?
  • 我不熟悉 Matlab 中的图像处理工具箱......而且我在这些过滤器中还是新手......我的问题是如何在图像中水平应用高斯过滤器,例如(一维不是二维)

标签: image matlab image-processing gaussian


【解决方案1】:

可以使用两个 1D 高斯执行具有 2D 高斯的卷积:

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 上的答案,它向您展示了如何确定给定内核是否可分离。例如,高斯是可分离的,而磁盘内核不是。
  2. Original article 解决上述问题。

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

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

【讨论】:

  • 感谢 Parag S. Chandakkar 的帮助...我有一个问题,您为什么选择 [ 3 3] ? ....这里怎么确定大小?
  • 这只是一个例子。请检查更新的答案。如果您觉得答案有帮助,请点击左侧的复选标记接受。
猜你喜欢
  • 2013-02-20
  • 2013-02-01
  • 1970-01-01
  • 2012-05-11
  • 2021-05-08
  • 2014-07-06
  • 2020-10-21
  • 2012-12-16
  • 2013-10-14
相关资源
最近更新 更多