opencv学习(1)傅里叶变换

根据论坛里面的代码,经过分析后自己重写了一遍,并抹去频谱里能量低的部分,可以看到图像效果损失不大。

果断贴代码

中间必然有冗余,没太想去弄函数,就想简单直接的写一遍。

当抹去面积为中间的7/8*7/8时,可看到图片有明显模糊。

int _tmain(int argc, _TCHAR* argv[])
{
IplImage* src,*dst,*FourierTemp,*Fourier,*ImageIm,*ImageRe;
IplImage* grayImage,*FourierDisplay;
double dMax,dMin,scale,shift;
src = cvLoadImage("lena.jpg");
grayImage =cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
dst = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
FourierDisplay = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
ImageRe = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);
ImageIm = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,1);
Fourier = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);
FourierTemp = cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);
cvCvtColor(src,grayImage,CV_RGB2GRAY);
cvConvertScale(grayImage,ImageRe);
cvZero(ImageIm);
cvMerge(ImageRe,ImageIm,0,0,FourierTemp);
cvDFT(FourierTemp,Fourier,CV_DXT_FORWARD);
cvSetImageROI(Fourier,cvRect(Fourier->width/8,Fourier->height/8,Fourier->width*3/4,Fourier->height*3/4));
cvSetZero(Fourier);
cvResetImageROI(Fourier);
cvSplit(Fourier,ImageRe,ImageIm,0,0);
cvPow(ImageRe,ImageRe,2);
cvPow(ImageIm,ImageIm,2);
cvAdd(ImageRe,ImageIm,ImageRe);
cvPow(ImageRe,ImageRe,0.5);
cvAddS(ImageRe,cvScalar(1.0),ImageRe);
cvLog(ImageRe,ImageRe);
cvMinMaxLoc(ImageRe,&dMin,&dMax);
scale = 255/(dMax-dMin);
shift = (-dMin)*scale;
cvConvertScale(ImageRe,FourierDisplay,scale,shift);
cvDFT(Fourier,FourierTemp,CV_DXT_INV_SCALE);
cvSplit(FourierTemp,ImageRe,ImageIm,0,0);
cvPow(ImageRe,ImageRe,2);
cvPow(ImageIm,ImageIm,2);
cvAdd(ImageRe,ImageIm,ImageRe);
cvPow(ImageRe,ImageRe,0.5);
cvMinMaxLoc(ImageRe,&dMin,&dMax);
scale = 255/(dMax-dMin);
shift = (-dMin)*scale;
cvConvertScale(ImageRe,dst,scale,shift);
cvNamedWindow("src");
cvShowImage("src",grayImage);
cvNamedWindow("Fourier");
cvShowImage("Fourier",FourierDisplay);
cvNamedWindow("dst");
cvShowImage("dst",dst);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvReleaseImage(&FourierTemp);
cvReleaseImage(&FourierDisplay);
cvReleaseImage(&Fourier);
cvReleaseImage(&ImageRe);
cvReleaseImage(&ImageIm);
cvReleaseImage(&grayImage);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值