高斯模糊+任意比率的抽取可以通过二元模糊/抽取步骤来实现吗?

时间:2019-03-02 15:51:10

标签: math signal-processing gaussianblur

我有一个数学问题(您可以在这里输入乳胶吗?)

我有一个图像image1,该图像先前已经(从图像image0开始)具有标准偏差sigma1的高斯模糊。

我想用std sigmaX的高斯模糊image1以产生一个新图像image2。结果应该是image2,就好像image2相对于原始的未模糊图像(image0)已经用标准偏差sigma2的高斯模糊了。

这个问题并不难,我们知道两个高斯滤波器的卷积是第三个滤波器。我可以通过以下方式计算sigmaX:

sigmaX = sqrt(sigma2 ^ 2-sigma1 ^ 2)

(之所以起作用,是因为先应用sigma1的高斯,再应用sigma2的高斯,就好像应用了一个sigma3的高斯一样,其中sigma3 ^ 2 = sigma1 ^ 2 + sigma2 ^ 2)。

我可以将带有sigmaX的高斯直接应用于image1以实现所需的image2。

此外,我想在模糊后将image2缩小N倍(例如,0.5缩小一半,0.25缩小四分之一)。请记住,1 / N和log2(sigma2 / sigma1)都不是整数,尽管它们始终是正数。

这是问题所在。在sigmaX非常大的情况下,该过程在计算上变得昂贵。由于无论如何我都会抽取图像,因此我想应用在(二元)高斯金字塔中经常使用的方法,在该方法中先应用模糊,然后进行抽取步骤,然后重复此步骤。但是,由于不能保证log2(sigma2 / sigma1)和1 / N是整数,将变换分解成较小的模糊抽取步数并不容易,因此我永远不必应用很大的高斯卷积。 / p>

我觉得这是可能的。

当前,我有:

    double sigmaratio = sigma2 / sigma1;
    double xsigma = sqrt( sigma2*sigma2 - sigma1*sigma1);
    double N = decimation_ratio //(e.g. 0.5 means decimate by half, 0.25 is by fourth, etc.)
    double sig_halves = log2( sigmaratio );
    double N_halves = -1 * log2(N); //will be =1 if we halve it once, =2 if twice, etc.

    //Taking floor to get the whole part...
    int intsighalves = (int) sig_halves;
    int intNhalves = (int) N_halves;
    int num = intsighalves;
    if( intNhalves < num )
     {
       num = intNhalves;
     }
    if( num >= 1 )
     {
       double Ndiff = N_halves - (double)num;
       double sigdiff = sig_halves - (double)num;
       //I need to apply num dyadic steps with some sigmaXprime at each step (getting 2x as large each time) and decimation by half at each step.
     }

我的问题是:如何在每个二进阶步骤中为整个零件选择sigmaXprime,以及何时/如何选择部分sigmaXprimepartial和部分抽取来获得与Guassian sigmaX卷积的image1的精确实现然后由N抽取?

0 个答案:

没有答案