Функция OpenCV, DFT не используется в изображении с IMREAD_COLOR - PullRequest
0 голосов
/ 07 октября 2018

При чтении изображения с помощью IMREAD_COLOR функция 'dft' выдает ошибку: Error

Функция DFT прекрасно работает при чтении изображения с IMREAD_GRAYSCALE.Но я хочу прочитать изображение с IMREAD_COLOR.

основная функция

const char* filename = "face.jpg";
Mat I = imread(filename, IMREAD_COLOR);
if(I.empty()) return 0;
Mat padded;

I.convertTo(padded, CV_32F);

Mat fft;
Mat planes[2];
dft(padded, fft, DFT_SCALE|DFT_COMPLEX_OUTPUT);

Mat fftBlur = fft.clone();

fftBlur *= 0.5;

split(fftBlur, planes);

Mat ph, mag;

mag.zeros(planes[0].rows, planes[0].cols, CV_32F);
ph.zeros(planes[0].rows, planes[0].cols, CV_32F);
cartToPolar(planes[0], planes[1], mag, ph);

merge(planes, 2, fftBlur);

//inverse
Mat invfft;

dft(fftBlur, invfft, DFT_INVERSE|DFT_REAL_OUTPUT);

Mat result;

invfft.convertTo(result, CV_8U);
Mat image;
cvtColor(result, image, COLOR_GRAY2RGB);

imshow("Output", result);
imshow("Image", image);


waitKey();

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Полученное вами сообщение является утверждением, в котором говорится, что функция DFT принимает только изображения с плавающей запятой одинарной точности с одним или двумя каналами (CV_32FC1, CV_32FC2, буква C в конце среднего значения флага) или изображения с плавающей запятой двойной точностис одним или двумя каналами (CV_64FC1, CV_64FC2).Случай с двумя каналами - фактически представление сложного изображения в хранилище данных OpenCV.Если вы хотите, вы можете разделить ваше изображение на std::vector<cv::Mat>, где каждый элемент представляет один канал, используя cv::split, примените DFT к каждому каналу, выполните необходимую обработку для него и заново создайте многоканальное изображение благодаря cv::merge.

0 голосов
/ 07 октября 2018

Из Изучение OpenCV (о функции dft):

Входной массив должен иметь тип с плавающей запятой, а может быть одно- или двухканальным .В одноканальном случае предполагается, что записи являются действительными числами, а выходные данные будут упакованы в специальный компактный формат, называемый комплексно-сопряженным симметричным.

Указан тот же вопрос здесь с точки зрения обработки изображений Matlab.Вы можете проверить функцию cv :: split, если хотите разделить каналы вашего исходного изображения.

...