首页 > 代码库 > 傅里叶变换和频域滤波
傅里叶变换和频域滤波
傅里叶变换
#include "opencv2/opencv.hpp"using namespace cv;#define PI2 2*3.141592654int main(){ Mat image = imread("lena.png"); resize(image, image, Size(100,100)); cvtColor(image,image,CV_RGB2GRAY); imshow("src",image); image.convertTo(image,CV_32FC1); for(int i=0; i<image.rows; i++) //中心化 { float *p = image.ptr<float>(i); for(int j=0; j<image.cols; j++) { p[j] = p[j] * pow(-1, i+j); } } ////////////////////////////////////////二维基本傅里叶变换////////////////////////////////////////////////// Mat dftRe = Mat::zeros(image.size(), CV_32FC1); Mat dftIm = Mat::zeros(image.size(), CV_32FC1); for(int u=0; u<image.rows; u++) { float *pRe = dftRe.ptr<float>(u); float *pIm = dftIm.ptr<float>(u); for(int v=0; v<image.cols; v++) { float sinDft=0, cosDft=0; for(int i=0; i<image.rows; i++) { float *q = image.ptr<float>(i); for(int j=0; j<image.cols; j++) { float temp = PI2 *((float)u*i/image.rows + (float)v*j/image.cols); sinDft -= q[j] * sin(temp); cosDft += q[j] * cos(temp); } } pRe[v] = sinDft; pIm[v] = cosDft; } } divide(dftRe, image.rows*image.rows, dftRe); divide(dftIm, image.rows*image.rows, dftIm); multiply(dftIm, dftIm, dftIm); multiply(dftRe, dftRe, dftRe); add(dftRe, dftIm, dftRe); pow(dftRe, 0.5, dftRe); imshow("mydft", dftRe); ///////////////////////////////////////快速傅里叶变换///////////////////////////////////////////////////// //int oph = getOptimalDFTSize(image.rows); //int opw = getOptimalDFTSize(image.cols); //Mat padded; //copyMakeBorder(image, padded, 0, oph-image.rows, 0, opw-image.cols, BORDER_CONSTANT, Scalar::all(0)); //Mat temp[] = {padded, Mat::zeros(image.size(),CV_32FC1)}; //Mat complexI; //merge(temp, 2, complexI); //dft(complexI, complexI); //傅里叶变换 ////显示频谱图 //split(complexI, temp); //Mat aa; //magnitude(temp[0], temp[1], aa); //divide(aa, oph*opw, aa); //imshow("aa",aa); /////////////////////////////////////////////频域滤波/////////////////////////////////////////////////////// ////生成频域滤波核 //Mat gaussianBlur(image.size(), CV_32FC2); //Mat gaussianSharpen(image.size(), CV_32FC2); //float D0 = 2*50*50.; //for(int i=0; i<oph; i++) //{ // float *p = gaussianBlur.ptr<float>(i); // float *q = gaussianSharpen.ptr<float>(i); // for(int j=0; j<opw; j++) // { // float d = pow(i-oph/2, 2) + pow(j-opw/2, 2); // p[2*j] = expf(-d / D0); // p[2*j+1] = expf(-d / D0); // q[2*j] = 1 - expf(-d / D0); // q[2*j+1] = 1 - expf(-d / D0); // } //} ////高斯低通滤波, 高斯高通滤波 //multiply(complexI, gaussianBlur, gaussianBlur); //multiply(complexI, gaussianSharpen, gaussianSharpen); ////傅里叶反变换 //dft(gaussianBlur, gaussianBlur, CV_DXT_INVERSE); //dft(gaussianSharpen, gaussianSharpen, CV_DXT_INVERSE); //Mat dstBlur[2], dstSharpen[2]; //split(gaussianBlur, dstBlur); //split(gaussianSharpen, dstSharpen); //for(int i=0; i<oph; i++) //中心化 //{ // float *p = dstBlur[0].ptr<float>(i); // float *q = dstSharpen[0].ptr<float>(i); // for(int j=0; j<opw; j++) // { // p[j] = p[j] * pow(-1, i+j); // q[j] = q[j] * pow(-1, i+j); // } //} //normalize(dstBlur[0], dstBlur[0], 1, 0, CV_MINMAX); //normalize(dstSharpen[0], dstSharpen[0], 1, 0, CV_MINMAX); //imshow("dstBlur",dstBlur[0]); //imshow("dstSharpen",dstSharpen[0]); waitKey(0); return 1;}
傅里叶变换和频域滤波
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。