傅里叶变换处理图像例子

来源:互联网 发布:暗黑破坏神2 mac 补丁 编辑:程序博客网 时间:2024/05/26 17:49
#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;//==============main函数===============int main(){Mat srcImage = imread("1.jpg", 0);if (!srcImage.data){printf("请确认目录下是否有图片? \n"); return false;}imshow("原图", srcImage);//===================添加干扰线条用于图像处理=============================for (int i = 0; i < srcImage.rows - 10;i+=10){line(srcImage, Point(0, i), Point(srcImage.cols - 1,i), Scalar(255), 1);}imshow("画了横线的图", srcImage);//getchar();//==============傅里叶变换int m = getOptimalDFTSize(srcImage.rows);  //获取最优尺寸int n = getOptimalDFTSize(srcImage.cols);Mat padded;copyMakeBorder(srcImage, padded, 0, m - srcImage.rows, 0, n - srcImage.cols, BORDER_CONSTANT, Scalar::all(0));  //填充边缘Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) }; //创建存储空间Mat complexI;merge(planes, 2, complexI);   //合成复图像dft(complexI, complexI);      //傅里叶变换函数//==========================定义一个低通滤波器================================================Mat low_filter = Mat::zeros(srcImage.rows, srcImage.cols, CV_8UC1);circle(low_filter, Point(0, 0), 70, Scalar(255), -1);circle(low_filter, Point(0, low_filter.cols - 1), 70, Scalar(255), -1);circle(low_filter, Point(low_filter.rows - 1, 0), 70, Scalar(255), -1);circle(low_filter, Point(low_filter.rows - 1, low_filter.cols - 1), 70, Scalar(255), -1);Mat high_filter = ~low_filter;  //高通滤波 取反//======================自定义处理一幅画了很多条横线的图像的掩码图像(根据幅度图像出现的规律性亮条来画)===================================================Mat filter = Mat::zeros(srcImage.rows, srcImage.cols, CV_8UC1);for (int j = srcImage.rows / 10; j < srcImage.rows * 9 / 10;j+=srcImage.rows/10){rectangle(filter, Rect(0, j - 1, srcImage.cols, 3), Scalar(255), -1);}rectangle(filter, Rect(0, 70, 70, srcImage.rows - 140), Scalar(255), -1);rectangle(filter, Rect(srcImage.cols-70, 70, 70, srcImage.rows - 140), Scalar(255), -1);//===========================================================================================================Mat filter_dst = ~filter;imwrite("filter_dst.jpg", filter_dst);Mat low_Image;complexI.copyTo(low_Image, filter_dst);   //按照掩码进行复制split(complexI, planes);                 //逆傅里叶变换//============================显示幅度图像用于观察噪声的地方(亮点或者其他)=======================================================magnitude(planes[0], planes[1], planes[0]);Mat magnitudeImage = planes[0];magnitudeImage += Scalar::all(1);log(magnitudeImage, magnitudeImage);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);normalize(magnitudeImage, magnitudeImage, 0, 1, NORM_MINMAX);/*//=========================================================================================================for (int i = 0; i < magnitudeImage.rows / 2 - 5; i++){for (int j = magnitudeImage.cols / 2 + 1; j < magnitudeImage.cols / 2 + 15; j++){magnitudeImage.at<float>(i, j) = 0;}}//=========================================================================================================for (int i = 0; i < magnitudeImage.rows / 2 - 5; i++){for (int j = magnitudeImage.cols / 2 - 15; j < magnitudeImage.cols / 2 - 2; j++){magnitudeImage.at<float>(i, j) = 0;}}//=========================================================================================================for (int i = magnitudeImage.rows / 2 + 5; i < magnitudeImage.rows ; i++){for (int j = magnitudeImage.cols / 2 - 15; j < magnitudeImage.cols / 2 - 2; j++){magnitudeImage.at<float>(i, j) = 0;}}//=========================================================================================================for (int i = magnitudeImage.rows / 2 + 5; i < magnitudeImage.rows ; i++){for (int j = magnitudeImage.cols / 2 + 1; j < magnitudeImage.cols / 2 + 15; j++){magnitudeImage.at<float>(i, j) = 0;}}Mat mm = magnitudeImage(Rect(0, 0, 10, 10));//===========================================================================================================cout << "幅度值=" << endl << "" << mm << endl << endl;//===========================================================================================================*/imshow("傅里叶变换频谱", magnitudeImage);//=================================================================================idft(low_Image, low_Image);    //逆傅里叶变换Mat low_dst_Image;Mat splitted_image[2];split(low_Image, splitted_image);//normalizesplitted_image[0](cv::Rect(0, 0, srcImage.cols, srcImage.rows)).copyTo(low_dst_Image);  //生成处理后的图像cv::normalize(low_dst_Image, low_dst_Image, 0, 1, CV_MINMAX);      //归一化,便于显示imshow("傅里叶滤波图", low_dst_Image);waitKey();return 0;}

0 0
原创粉丝点击