Размытие по Гауссу + Децимация произвольного отношения может быть реализована с помощью шагов диадического размытия / прореживания? - PullRequest
0 голосов
/ 02 марта 2019

У меня небольшая математическая проблема (можете ли вы здесь ввести латекс?).

У меня есть изображение image1, которое я ранее размыл (из image0) с помощью гауссианы со стандартным отклонением sigma1.

Я бы хотел размыть изображение1 с помощью гауссиана std sigmaX, чтобы получить новое изображение, изображение2.Результатом должно быть изображение2, как если бы изображение2 было размыто с помощью гауссианы sigma2 со стандартным отклонением относительно исходного не размытого изображения (image0).

Эта проблема не сложна, мы знаем, что сверткадва гауссовых фильтра - это третий фильтр.Я могу вычислить сигмаX:как если бы был применен один гауссиан sigma3, где sigma3 ^ 2 = sigma1 ^ 2 + sigma2 ^ 2).

Я могу напрямую применить гауссиан с sigmaX к image1, чтобы получить желаемое изображение2.

Кроме того, я хотел бы прореживать изображение2 с коэффициентом N (например, 0,5 - прореживание вдвое, 0,25 - четверть) после размытия.Помните, что ни 1 / N, ни log2 (sigma2 / sigma1) не должны быть целыми числами, хотя они всегда будут положительными.

В этом проблема.В случае, когда sigmaX очень велик, процесс становится вычислительно дорогим.Так как в любом случае я буду прореживать изображение, я хотел бы применить метод, который часто используется в (диадических) гауссовых пирамидах, где применяется размытие с последующим шагом прореживания, а затем повторение этого.Однако, поскольку log2 (sigma2 / sigma1) и 1 / N не гарантированно являются целыми числами, непросто разбить преобразование на более мелкие шаги с размытием и размытием, чтобы мне никогда не приходилось применять очень большую свертку Гаусса.

У меня такое ощущение, что это возможно.

В настоящее время у меня есть:

    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 на каждом двоичном шаге дляцелые части, и когда / как я могу выбрать частичную частичную сигмаX и частичную прореживание, чтобы получить точную реализацию изображения1, свернутого с гуасиановым сигмаХ, с последующим прореживанием N?

...