Я пытаюсь сделать масштабирование изображения с помощью 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();
}
Вот как это выглядит:
Задача ещё не решена.
Других решений пока нет …