удаление размытия изображения путем деконволюции с использованием opencv

У меня есть два изображения o1 & o2и я размыл два изображения, используя одно и то же ядро ​​размытия по Гауссу. Тогда я нашел ядро k1 = DFT(b1) / DFT (o1), где b1 это изображение, полученное размыванием o1,

Я использовал этот кернал (k1) выполнить деконволюцию на b2, где b2 получается размытием o2,

Но нечеткий вывод неправильный (выходное изображение не имеет никакого отношения к оригиналу), в чем проблема в моем коде?

int main(int argc, char** argv)
{
Mat orig1 = imread(argv[1], 0);
Mat orig2 = imread(argv[2], 0);

Mat blur1, blur2;
GaussianBlur(orig1, blur1, Size(11, 11), 0, 0 );
GaussianBlur(orig2, blur2, Size(11, 11), 0, 0 );

imshow("or1", orig1);
imshow("bl1", blur1);
imshow("or2", orig2);
imshow("bl2", blur2);
waitKey(0);deconvolution(orig1, blur1, orig2, blur2);

return 0;
}
void deconvolution(Mat & o1, Mat & b1, Mat & o2, Mat & b2)
{
Mat o1f, o2f, b1f, b2f;
Mat o1dft, o2dft, b1dft, b2dft;

o1.convertTo(o1f, CV_32F);
b1.convertTo(b1f, CV_32F);
o2.convertTo(o2f, CV_32F);
b2.convertTo(b2f, CV_32F);

computeDFT(o1f, o1dft);
computeDFT(b1f, b1dft);
computeDFT(o2f, o2dft);
computeDFT(b2f, b2dft);

Mat k1, k2, b1d, b2d;
divide(b1dft, o1dft, k1);

Mat r1, r2;
divide(b1dft, k1, r1);
divide(b2dft, k1, r2);

Mat idftr1, idftr2;
computeIDFT(r1, idftr1);
computeIDFT(r2, idftr2);

Mat r1_8u, r2_8u;
idftr1.convertTo(r1_8u, CV_8U);
idftr2.convertTo(r2_8u, CV_8U);

imshow("r1", r1_8u);
imshow("r2", r2_8u);
waitKey(0);
destroyAllWindows();
}

Изображения o1, o2, b1, b2, r1 а также r2 приведены в порядке ниже:

o1 (исходное изображение - 1)

о2 (исходное изображение - 2)

b1 (оригинал 1 размыт)

b2 (оригинал 2 размыт)

b1 отменил

b2 отменил

3

Решение

Проблема, скорее всего, в том, что ваше размытое ядро ​​имеет исчезающие коэффициенты для определенных частот. Для каждого коэффициента преобразования вашего сигнала (f) и размытия ядра (h) вы вычисляете f / h прямо сейчас. Это фактически деление на ноль для этих коэффициентов, что приводит к сильному шуму, который вы наблюдаете.

Быстрое решение для этого будет псевдообратная фильтрация:

используйте f / h только для | h | > эпсилон

установить коэффициент на 0 иначе

Если это не достаточно гладко, вы можете получить лучшие результаты с
фильтра Винера.

2

Другие решения


По вопросам рекламы [email protected]