我有一个数学问题(您可以在这里输入乳胶吗?)
我有一个图像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抽取?