图像的傅里叶变换和逆变换C++版
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                图像的傅里叶变换和逆变换C++版
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                目錄
頭文件:包含OpenCV和標準庫輸出調試
讀入并顯示原圖
進行離散傅里葉變換和逆變換
顯示傅里葉變換圖
完整代碼:
參考文獻:
首先把整體程序分段,每段都是單獨的功能。最后再把完整代碼給出:
頭文件:包含OpenCV和標準庫輸出調試
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; #include <iostream> using std::cout; using std::endl;int main(int argc, char*argv[]){waitKey(0);return 0; }讀入并顯示原圖
Mat img = imread("2.png");if (!img.data)return -1;namedWindow("原圖", WINDOW_AUTOSIZE);imshow("原圖", img);進行離散傅里葉變換和逆變換
//快速傅里葉變換 void ImageDFT(InputArray srcImage, OutputArray dstImage) {//得到Mat類型Mat src = srcImage.getMat();int rows = src.rows;int cols = src.cols;//快速傅里葉變換的計算速度與圖像的大小有關,計算最優圖像尺寸,然后進行擴充,擴充值為0Mat padded;int rPadded = getOptimalDFTSize(rows);int cPadded = getOptimalDFTSize(cols);copyMakeBorder(src, padded, 0, rPadded - rows, 0, cPadded - cols, BORDER_CONSTANT, Scalar::all(0));//快速的傅里葉變換(雙通道:用于存儲實部 和 虛部)dft(padded, dstImage, DFT_COMPLEX_OUTPUT); }//轉換成灰度圖,浮點型圖Mat fImg;cvtColor(img, img, CV_BGR2GRAY); img.convertTo(fImg, CV_64FC1);//快速傅里葉變換Mat fftImage;ImageDFT(fImg, fftImage);//傅里葉逆變換Mat image;cv::dft(fftImage, image, DFT_INVERSE + DFT_REAL_OUTPUT + DFT_SCALE);namedWindow("fft逆變換圖", WINDOW_AUTOSIZE);imshow("fft逆變換圖", image);顯示傅里葉變換圖
Mat planes[2];split(fftImage, planes);cout << fftImage.channels() << endl;magnitude(planes[0], planes[1], planes[0]);Mat magnitudeImage = planes[0];magnitudeImage += Scalar::all(1); // 所有的像素都加1log(magnitudeImage, magnitudeImage); // 求自然對數normalize(magnitudeImage, magnitudeImage, 0, 1, NORM_MINMAX);// 頻譜圖像長寬變為偶數,然后頻譜中心化magnitudeImage = magnitudeImage(Rect(0, 0, magnitudeImage.cols & -2, magnitudeImage.rows & -2));int cx = magnitudeImage.cols / 2;int cy = magnitudeImage.rows / 2;Mat q0(magnitudeImage, Rect(0, 0, cx, cy));Mat q1(magnitudeImage, Rect(cx, 0, cx, cy));Mat q2(magnitudeImage, Rect(0, cy, cx, cy));Mat q3(magnitudeImage, 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);imshow("fft圖", magnitudeImage);完整代碼:
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; #include <iostream> using std::cout; using std::endl;//快速傅里葉變換 void ImageDFT(InputArray srcImage, OutputArray dstImage) {//得到Mat類型Mat src = srcImage.getMat();//判斷位深//CV_Assert(src.type() == CV_32FC1 || src.type() == CV_64FC1);//CV_Assert(src.channels() == 1 || src.channels() == 2);int rows = src.rows;int cols = src.cols;//快速傅里葉變換的計算速度與圖像的大小有關,計算最優圖像尺寸,然后進行擴充,擴充值為0Mat padded;int rPadded = getOptimalDFTSize(rows);int cPadded = getOptimalDFTSize(cols);copyMakeBorder(src, padded, 0, rPadded - rows, 0, cPadded - cols, BORDER_CONSTANT, Scalar::all(0));//快速的傅里葉變換(雙通道:用于存儲實部 和 虛部)dft(padded, dstImage, DFT_COMPLEX_OUTPUT); } int main(int argc, char*argv[]) {//輸入圖像矩陣//Mat img = imread("2.png", CV_LOAD_IMAGE_GRAYSCALE);Mat img = imread("2.png");if (!img.data)return -1;namedWindow("原圖", WINDOW_AUTOSIZE);imshow("原圖", img);//轉換成灰度圖,浮點型圖Mat fImg;cvtColor(img, img, CV_BGR2GRAY); img.convertTo(fImg, CV_64FC1);//快速傅里葉變換Mat fftImage;ImageDFT(fImg, fftImage);//傅里葉逆變換Mat image;cv::dft(fftImage, image, DFT_INVERSE + DFT_REAL_OUTPUT + DFT_SCALE);Mat planes[2];split(fftImage, planes);cout << fftImage.channels() << endl;magnitude(planes[0], planes[1], planes[0]);Mat magnitudeImage = planes[0];magnitudeImage += Scalar::all(1); // 所有的像素都加1log(magnitudeImage, magnitudeImage); // 求自然對數normalize(magnitudeImage, magnitudeImage, 0, 1, NORM_MINMAX);magnitudeImage = magnitudeImage(Rect(0, 0, magnitudeImage.cols & -2, magnitudeImage.rows & -2));int cx = magnitudeImage.cols / 2;int cy = magnitudeImage.rows / 2;Mat q0(magnitudeImage, Rect(0, 0, cx, cy)); Mat q1(magnitudeImage, Rect(cx, 0, cx, cy)); Mat q2(magnitudeImage, Rect(0, cy, cx, cy)); Mat q3(magnitudeImage, 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);imshow("fft圖", magnitudeImage);//裁剪傅里葉逆變換image = image(Rect(0, 0, img.cols, img.rows));image.convertTo(image, CV_8UC1);namedWindow("逆變換圖", WINDOW_AUTOSIZE);imshow("逆變換圖", image);waitKey(0);return 0; }參考文獻:
https://www.zhihu.com/question/355013340
https://blog.csdn.net/xddwz/article/details/110938652
https://blog.csdn.net/Moment3/article/details/79333781?utm_source=blogxgwz7
https://blog.csdn.net/qazwsxrx/article/details/104672192
總結
以上是生活随笔為你收集整理的图像的傅里叶变换和逆变换C++版的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 分享的好处
 - 下一篇: matlab eval函数用法