image - 水平和垂直一维高斯滤波器

标签 image matlab image-processing gaussian

<分区>

我正在尝试生成可应用于图像的高斯滤波器,但我想将它应用于一维两次:水平和垂直。此外,我想将它分别应用于每个平面。

这意味着我想设计一维高斯滤波器以将其水平应用到红色、绿色、蓝色组件中,然后我使用相同的一维高斯滤波器将其垂直应用到红色、绿色、蓝色组件中。

而且我认为这个操作应该等于在原始彩色图像上应用 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

补充阅读:

  1. This Stackoverflow.com 上的答案向您展示了如何确定给定内核是否可分离。比如Gaussian是可分的,而disk kernel则不是。
  2. Original article针对上述问题。

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

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

关于image - 水平和垂直一维高斯滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695046/

相关文章:

java - 在java中摆脱png的某些部分

asp.net - 如何让 ASP.net 对象出现在同一行?

c - 如何产生图像噪声频率?

python - 光谱聚类、图像分割和特征向量

javascript - 如何在 VR 耳机中查看来自网站的 VR/360 照片?

html - 边框半径在 safari 4.0、5.0 for windows 7 及更高版本中不起作用

python - 如何将以下 Matlab 循环转换为 Python?

python - 从 Matlab 运行 python 脚本 - 无法加载 matplotlib

MATLAB:曲线拟合到 plotmatrix 中的散点数据

python - PyTorch 中 fc.bias 和 fc.weight 的大小不匹配