Двумерный iir фильтр - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь использовать очень простой 2d БИХ-фильтр нижних частот (a может варьироваться от нуля до единицы), аналогичный

y' = -a*y + x

Как будто решено с помощью метода прямого Эйлера.

        for(uint32_t row = 1; row < img.height(); ++row)
        {
            for(uint32_t col = 1; col < img.width(); ++col)
            {
                auto output_x = img_in(col, row) + img(col - 1, row) * (1.0f - a);
                auto output_y = img_in(col, row) + img(col, row - 1) * (1.0f - a);

                auto sum = 0.5f*(output_x + output_y);

                img(col, row) = sum;
            }
        }

img_in - это исходное изображение, а img - это изображение, в которое выполняется запись.

Нормальный вывод для a = 0 с белым шумом на входе выглядит следующим образом:

brownian noise attempt

Как можно видеть, сумма x-фильтра и y-фильтра является диагональным результатом. Есть ли уловка для решения этой проблемы? Я предполагаю, что проблема возникает из-за того, что аппроксимация производных - это не центральные различия, а обратные различия.

Я попытался заполнить img(col - 1, row) также для компенсации, но затем линии вместо этого становятся вертикальными .

...