Ответы пользователя по тегу C++
  • Из-за чего могут возникать различия при работе с преобразованиями Фурье в OpenCV и matlab?

    @krox Автор вопроса
    аспирант, программист, исследователь
    В общем, не знаю правильно ли получил или нет, но получилось следующее
    69f7e73ca7584cfaa3e92abc39b5d5db.pngРезультат с модулем

    код следующий:
    cv::Mat MainWindow::fourierSpectrum(Mat img)
    {
    
        src = img; //imread(path.toStdString(), 1); //читаем открытое изображение
    
    
       cvtColor(src, src_gray, CV_RGB2GRAY);
    
        int M = getOptimalDFTSize( src_gray.rows );
            int N = getOptimalDFTSize( src_gray.cols );
            Mat padded;
            copyMakeBorder(src_gray, padded, 0, M - src_gray.rows, 0, N - src_gray.cols, BORDER_CONSTANT, Scalar::all(0));
    
            Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
            Mat complexImg;
            merge(planes, 2, complexImg);
    
            dft(complexImg, complexImg, DFT_COMPLEX_OUTPUT);
    
            cv::multiply(cv::abs(complexImg), complexImg, complexImg);
    
            idft(complexImg,complexImg);
            split(complexImg, planes);
    
            magnitude(planes[0], planes[1], planes[0]);
            Mat mag = planes[0];
            mag += Scalar::all(1);
            //log(mag, mag); //если это не закомментить получается спектр, показанный в вопросе
    
            normalize(mag, mag, 0, 255, CV_MINMAX);
            mag.copyTo(src_gray);
            return src_gray;
    
    }


    Немного фана: нарисовав сердечко и применив данное преобразование с добавлением красного цвета
    cvtColor(src_gray, src_gray, CV_GRAY2RGB);
    src_gray += CV_RGB(255,0,0);

    получается довольно забавный эффект
    1e12c43d58c94e8e804511b186ad4975.png

    Может кому пригодится.
    P.S> если из кода убрать cv::abs получается следующая картинка:
    a45c8fe323834bf9a9173d69e543d53e.pngРезультат без модуля
    P.S.S> Загруженные на хабр картинки в чёрных тонах почему-то искажаются....
    Ответ написан
    Комментировать
  • Как разделить содержимое монохромного изображения на отдельные файлы?

    @krox Автор вопроса
    аспирант, программист, исследователь
    Так как поступают ответы, напишу вариант, на котором я остановился и реализовал.
    1. В библиотеке OpenCV берётся алгоритм поиска контуров.
    2. Если контур удовлетворяет условиям по размерам (не шум и не слишком маленький) копируем этот контур на новое изображение
    3. По имеющимся координатам крайних точек контура просто вырезаем изображение из картинки
    4. Сохраняем результат в файл.
    Всё оказалось довольно просто
    Ответ написан
    1 комментарий
  • Что делать с ошибкой undefined reference to при передаче параметра в функцию?

    @krox Автор вопроса
    аспирант, программист, исследователь
    Пока мне отвечали, нашёл ещё одно решение. Можно удалить из хэдера объявление separate_image и перенести его в самое начало .cpp файла. Тогда будет работать вариант, на котором у меня была ошибка.
    Ответ написан