Масштабирование с использованием дискретного преобразования Фурье и заполнения нулями в opencv Stack Overflow

Я пытаюсь сделать масштабирование изображения с помощью DFT (дискретное преобразование Фурье) в opencv c ++. Идея состоит в том, чтобы сделать и DFT к изображению, затем добавить к нему нулевую границу, а затем сделать инверсию DFT. Я столкнулся с проблемой в результате. Я предполагаю, что это в заполнении результата DFT с нулем. Вот мой код Любой, у кого есть идея, как ее решить, пожалуйста, помогите мне, и спасибо заранее.

#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
#include<opencv2/opencv.hpp>
#include<opencv2/opencv_modules.hpp>
#include<iostream>
#include<string.h>using namespace cv;
using namespace std;void calculeDFT(Mat& source , Mat& destination)
{

Mat origincomplex [2] = {source , Mat::zeros(source.size(),CV_32F)};

Mat dtfready;

merge(origincomplex, 2, dtfready);

Mat origindft;

dft(dtfready, origindft , DFT_COMPLEX_OUTPUT);

destination = origindft ;

}
void Ajoutbor(Mat& source, Mat& destination)
{
copyMakeBorder(source,source,50,50,50,50, BORDER_CONSTANT,0);

Mat splitTab[2] = {Mat::zeros(source.size(),CV_32F),Mat::zeros(source.size(),CV_32F)};

split(source,splitTab);

//Mat dftMag;

copyMakeBorder(splitTab[0],splitTab[0],50,50,50,50, BORDER_CONSTANT,0);

copyMakeBorder(splitTab[1],splitTab[1],50,50,50,50, BORDER_CONSTANT,0);

merge(splitTab, 2 , destination);

//magnitude(splitTab[0], splitTab[1], dftMag);

//dftMag += Scalar::all(1);

//log(dftMag, dftMag);

//normalize(dftMag, dftMag, 0, 1, CV_MINMAX);

//CenterDFT(dftMag);

//imshow("DFT",dftMag);

//destination = dftMag ;

waitKey();

}

void CenterDFT(Mat& source)
{
int cx = source.cols/2;
int cy = source.rows/2;

Mat q0(source, Rect(0, 0, cx, cy));
Mat q1(source, Rect(cx, 0, cx, cy));
Mat q2(source, Rect(0, cy, cx, cy));
Mat q3(source, Rect(cx, cy, cx, cy));

Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);

q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);

}
void afficheDFT(Mat& source)
{
Mat splitTab[2] = {Mat::zeros(source.size(),CV_32F),Mat::zeros(source.size(),CV_32F)};

split(source,splitTab);

Mat dftMag;

magnitude(splitTab[0], splitTab[1], dftMag);

dftMag += Scalar::all(1);

log(dftMag, dftMag);

normalize(dftMag, dftMag, 0, 1, CV_MINMAX);

CenterDFT(dftMag);

imshow("DFT",dftMag);

waitKey();

}

void InverseDFT(Mat& source,Mat& destination)
{
Mat inverse;

dft(source, inverse, DFT_INVERSE | DFT_REAL_OUTPUT | DFT_SCALE);

destination = inverse ;

}
int main()
{Mat img = imread("bn.jpg", CV_LOAD_IMAGE_GRAYSCALE);

Mat imgfloat;

img.convertTo(imgfloat ,CV_32FC1 , 1.0 /255.0);

imshow("Image Original",imgfloat);

Mat imgdft;

calculeDFT(imgfloat,imgdft);

Mat imgap;afficheDFT(imgdft);

Ajoutbor(imgdft,imgap);

Mat inversdft;

InverseDFT(imgap,inversdft);imshow("inverse ", inversdft);

cvWaitKey();

}

Вот как это выглядит:

2

Решение

Задача ещё не решена.

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

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

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