У меня небольшая математическая проблема (можете ли вы здесь ввести латекс?).
У меня есть изображение 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?