OpenCV и работа с преобразованием Фурье dft ()

Я пытаюсь поочередно умножить преобразования Фурье двух отдельных изображений, а затем преобразовать обратно в нормальное изображение. Я не очень знаком с использованием преобразования Фурье в OpenCV, но это то, что у меня есть на данный момент. Последняя строка, в которой отображается вывод, вызывает исключение типа «System.Runtime.InteropServices.SEHException», но я не могу понять, как это исправить. Я пробовал различные параметры и функции на каждом этапе, но все, кажется, либо дают исключение, либо пустой вывод. Что я делаю неправильно? Спасибо за любую помощь, вы можете дать мне!

Mat dftInput1, dftImage1, dftInput2, dftImage2, multipliedDFT, inverseDFT, inverseDFTconverted;

image1.convertTo(dftInput1, CV_32F);
dft(dftInput1, dftImage1, DFT_COMPLEX_OUTPUT);
image2.convertTo(dftInput2, CV_32F);
dft(dftInput2, dftImage2, DFT_COMPLEX_OUTPUT);

multiply(dftImage1, dftImage2, multipliedDFT);

idft(multipliedDFT, inverseDFT, DFT_SCALE);
inverseDFT.convertTo(inverseDFTconverted, CV_8U);
imshow("Output", inverseDFTconverted);

0

Решение

imshow не может показать 2-канальные изображения, только 1,3,4-канальные.

если вы используете DFT_COMPLEX_OUTPUT для dft, вы получаете 2-канальное изображение, применение обратного idft снова приводит к 2-канальному (сложному) мату

понятия не имею, почему вы получаете ‘System.Runtime.InteropServices.SEHException’, хотя (это «управляемый c ++»?)

convertTo () изменяет тип каналов, но не их количество (да, неожиданность).

так что, либо ограничьте это реальной частью:

 idft(multipliedDFT, inverseDFT, CV_DFT_SCALE | CV_DFT_REAL_OUTPUT );

или разделить его, и бросить только реальную часть на imshow:

Mat chan[2];
split( inverseDFTconverted, chan );
imshow("lalala", chan[0]);
2

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector