在高斯模糊中将2d掩模转换为1d

时间:2014-08-09 08:49:50

标签: image-processing linear-algebra gaussian convolution

我正在尝试实现高斯模糊。我已经使用wikipedia上提供的2d函数计算了掩码。我目前有一个2d矩阵。据我所知,为了改善运行时间,可以避免使用标准卷积方法,因为高斯的可分离性。换句话说,正如This answer所说,“在高斯模糊情况下,它分解为两个一维操作”。

This page有帮助,但是,我不明白如何从现有的2d掩码中获取1d掩码。例如,this page将图3中的2d掩码转换为图4中的1d掩码。如何进行此转换?

[编辑]

是否足以计算一开始的1d掩模,并将其应用于x方向,然后应用y?

[编辑2]

我已经发现是的,人们可以简单地生成1d蒙版并在x和y方向上使用它。然而,问题是当我应用高斯滤波器时所得图像的质量。

Original Image(Input) Output

我假设当计算蒙版的点积和原始图像的选定部分时,需要进行操作。什么可能导致结果图像像这样?

[编辑]

除了@Jeremie Miserez的回答之外,这个page非常有帮助。如果需要了解如何完成,它还有代码。

1 个答案:

答案 0 :(得分:8)

关于可分离卷积的

This article应该清楚一点。

我最近不得不这样做,所以这里是:作为一个例子,我们使用基于二维高斯分布的内核,标准偏差为0.85。我们想要一个3x3内核(Matlab代码)。

>> h = fspecial('gaussian',3,0.85)

h =
    0.0626    0.1250    0.0626
    0.1250    0.2497    0.1250
    0.0626    0.1250    0.0626

请注意,所有条目的总和为1,即如果将其应用为过滤器,图像的亮度不会改变:

>> sum(sum(h))

ans =
     1

另请注意,rank为1,因此内核实际上是可分的(两个向量h1h2,当乘以时会h:{{1 }})

h1*h2=h

太好了,我们可以继续了。请注意,如果排名大于1,您仍然可以得到近似值,但您可能需要使用其他技术(请参阅末尾的链接)。

在不详细说明的情况下,我们使用>> rank(h) ans = 1 函数进行singular value decomposition。这是一个标准函数,计算svd并且在许多数学库中都可用。

U*S*V'=h

我们现在知道>> [U,S,V] = svd(h) U = -0.4085 0.9116 -0.0445 -0.8162 -0.3867 -0.4292 -0.4085 -0.1390 0.9021 S = 0.3749 0 0 0 0.0000 0 0 0 0.0000 V = -0.4085 -0.3497 -0.8431 -0.8162 0.5534 0.1660 -0.4085 -0.7559 0.5115 U*S*V'=hV'的转置)。现在,对于秩1矩阵,V应该只有1个奇异值,其余应该为0(请参阅本答案末尾的讨论以获得更多信息)。

所以我们现在需要的是S。我们可以将(h1)*(h2)=h拆分为两个不同的值,以便S。因此,我们得到:s1*s2=S,然后是U*s1*s2*V'=h

您可以根据需要选择如何拆分(U*s1)*(s2*V')=h,但使用平方根会在SS之间平均分配h1

h2

请注意,我们不需要带有零的额外行/列,因此我们可以更简单地执行此操作:

>> h1 = U*sqrt(S)

h1 =
   -0.2501    0.0000   -0.0000
   -0.4997   -0.0000   -0.0000
   -0.2501   -0.0000    0.0000

>> h2 = sqrt(S)*V'

h2 =
   -0.2501   -0.4997   -0.2501
   -0.0000    0.0000   -0.0000
   -0.0000    0.0000    0.0000

请注意,减号相互抵消,如果您愿意,也可以从>> h1 = U(:,1)*sqrt(S(1,1)) h1 = -0.2501 -0.4997 -0.2501 >> h2 = sqrt(S(1,1))*V(:,1)' h2 = -0.2501 -0.4997 -0.2501 h1删除它们:

h2

这几乎与我们以前的相同:

h1 =
    0.2501
    0.4997
    0.2501
h2 =
    0.2501    0.4997    0.2501

>> h1*h2

ans =
    0.0626    0.1250    0.0626
    0.1250    0.2497    0.1250
    0.0626    0.1250    0.0626

请注意,机器精度>> h1*h2 - h ans = 1.0e-16 * 0 0.2776 -0.1388 0 0.5551 -0.2776 0 0.2776 -0.1388 只是:

eps

所以错误是微乎其微的,在这种情况下是由于不精确。如果您有任何大于此的误差,您很可能只是忽略剩余的奇异值并计算>> eps ans = 2.2204e-16 的等级1近似值。在这种情况下,您可能需要查看其他选项以获得更好的近似值,例如this implementationthis implementation