图像变换之傅里叶变换.zip

  • KKKKK36985
    了解作者
  • C/C++
    开发工具
  • 9.2MB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 0
    下载次数
  • 2020-06-14 17:52
    上传日期
实现图像的傅里叶变换通过OPENCV,应用经典的傅里叶变换,实现图像变换
图像变换之傅里叶变换.zip
内容介绍
#include "pch.h" #include "opencv2/opencv.hpp" #include <iostream> #include "opencv2/highgui/highgui_c.h" #include "cmath" using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread("C:/Users/Sure/Pictures/picture.jpg",IMREAD_GRAYSCALE);//灰度图 if (src.empty()) { printf("chould not load image...\n"); return -1; } namedWindow("原图", CV_WINDOW_AUTOSIZE);//WINDOW_AUTOSIZE:自动根据图像大小显示窗口大小,不可认为改变 imshow("原图", src); //求输入图像DFT最佳尺寸大小 int m = getOptimalDFTSize(src.rows); int n = getOptimalDFTSize(src.cols); //用常量法添加像素,将添加的像素置为0 Mat padded; copyMakeBorder(src, padded, 0, m - src.rows, 0, n - src.cols, BORDER_CONSTANT, Scalar::all(0)); //为傅立叶变换的结果(实部和虚部)分配存储空间。 //将planes数组组合合并成一个多通道的数组complexI Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) }; Mat complexI; merge(planes, 2, complexI);//merge函数:第一个参数是图像矩阵数组,第二个参数是需要合并矩阵的个数,第三个参数是输出 //进行傅里叶变换 dft(complexI, complexI); //将复数转换为幅值,即=> log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2)) split(complexI, planes); // 将多通道数组complexI分离成2个单通道数组,planes[0] = Re(DFT(I), planes[1] = Im(DFT(I)) Mat realImg = planes[0];//实数图 Mat imagImg = planes[1];//虚数图 //magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude //Mat magnitudeImage = planes[0]; Mat magnitudeImage;//幅值 magnitude(planes[0], planes[1], magnitudeImage); //magnitude:计算二维矢量幅值函数 //第一个参数为实部,第二个参数为虚部,第三个参数为输出幅值。 Mat phaseImg; phaseImg.create(realImg.size(), realImg.type());//和实部大小,类型相同 for (int i = 0; i < realImg.rows; i++) { double* realData = realImg.ptr<double>(i); double* imagData = imagImg.ptr<double>(i); double* phaseData = phaseImg.ptr<double>(i); for (int j = 0; j < realImg.cols; j++) { phaseData[j] = atan(imagData[j] / realData[j]);//求反正切函数atan } } //进行对数尺度(logarithmic scale)缩放 magnitudeImage += Scalar::all(1); log(magnitudeImage, magnitudeImage);//求自然对数 phaseImg += Scalar::all(1); log(phaseImg, phaseImg); //剪切和重分布幅度图象限 //若有奇数行或奇数列,进行频谱裁剪 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)); // ROI区域的左上 Mat q1(magnitudeImage, Rect(cx, 0, cx, cy)); // ROI区域的右上 Mat q2(magnitudeImage, Rect(0, cy, cx, cy)); // ROI区域的左下 Mat q3(magnitudeImage, Rect(cx, cy, cx, cy)); // ROI区域的右下 //交换象限(左上与右下进行交换) Mat tmp; q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3); //交换象限(右上与左下进行交换) q1.copyTo(tmp); q2.copyTo(q1); tmp.copyTo(q2); //归一化,用0到1之间的浮点值将矩阵变换为可视的图像格式 normalize(magnitudeImage, magnitudeImage, 0, 1, CV_MINMAX); normalize(phaseImg, phaseImg, 0, 1, CV_MINMAX); imshow("频谱幅值", magnitudeImage); imshow("相位图", phaseImg); Mat recomplexim; complexI.copyTo(recomplexim);//把变换结果复制一份,进行逆变换,也就是恢复原图 Mat iDft[] = { Mat::zeros(planes[0].size(),CV_32F),Mat::zeros(planes[0].size(),CV_32F) };//创建两个通道,类型为float,大小为填充后的尺寸 idft(recomplexim, recomplexim);//傅立叶逆变换 split(recomplexim, iDft);//结果貌似也是复数 magnitude(iDft[0], iDft[1], iDft[0]);//分离通道,主要获取0通道 normalize(iDft[0], iDft[0], 1, 0, CV_MINMAX);//归一化处理,float类型的显示范围为0-1,大于1为白色,小于0为黑色 imshow("逆变换", iDft[0]);//显示逆变换 waitKey(0);//按下任意按键关闭窗口 return 0; }
评论
    相关推荐
    • 数字图像处理
      本书是数字图像处理理论与实践相结合的成功之作,强调理论用于解决工业或科学研究中常见的实际问题。这种与基本概念和数字图像处理的各种实用技术,使读者能用这些技术解决数字图像中的新问题。 全书共22章,1-5章...
    • Hough变换图像处理
      Hough变换的matlab程序,对初学者了解Hough变换很有帮助
    • 小波变换图像处理 数字图像处理
      小波滤波 图像增强 数字处理将文件所在目录设为工作目录,然后打开wavlet.fig,在noise提示框下输入噪声强度,在0-0.1之间(不能为零)。 然后点process按钮,就会显示实验结果,包括原图像,加噪图像,去噪图像的...
    • 冈萨雷斯图像处理MATALB灰度变换
      冈萨雷斯图像处理MATLAB灰度变换,包含log变换,imjust变换,对比度拉升变换,指定任意灰度变换
    • VC++图像处理之小波变换
      用VC编写的小波图像处理程序 希望学习VC图像处理,爱好小波变换的程序员喜欢
    • 小波变换图像处理
      有关图像处理,仅用于学习,课程来源及使用方法文件夹中有说明。
    • 图像处理之灰度变换
      通过利用VC++对不同格式的图像进行图像处理变换
    • 数字图像处理的几何变换程序
      数字图像处理的几何变换程序,超级棒!可实现,图像旋转,缩放,平移等功能,VC++编写
    • Visual C++ 程序 阈值变换 图像处理
      阈值变换 Visual C++ 程序 图像处理
    • 数字图像处理hough变换
      数字图像处理中hough变换模块,内附源代码和测试图片