离散傅里叶变换实现图像平滑 opencv c++

离散二维傅里叶变换

常用性质:
可分离性、周期性和共轭对称性、平移性、旋转性质、卷积与相关定理;

卷积与相关定理

卷积定理包括空间域卷积和频率域卷积,卷积是空间域滤波和频率域滤波之间的纽带:两个空域信号的卷积等价于其频域信号的乘积
f ( x , y ) ∗ h ( x , y ) → F ( u , v ) H ( u , v ) f(x,y)*h(x,y) → F(u,v)H(u,v) f(x,y)h(x,y)F(u,v)H(u,v)

该性质的好处是将需要经过翻折、平移、相乘、求和等步骤实现的复杂的卷积运算简化为简单的乘法运算,这也是快速傅里叶变换(FFT)的出现使得该性质得到更广泛应用,同时,该性质对于理解信号的频率域处理方法特别重要,使得信号的空间域处理可以转换到频率域进行处理实现。

实现代码

SmoothbyDFT

void SmoothByDFT(Mat &srcF, Size size, Mat &dst) {
	Mat smoothF = Mat::ones(size, CV_8UC1);
	Mat smooth, src;
	smoothF.convertTo(smooth, CV_32FC1, 1.0 / size.area());//将图像和平滑模板转为单通道64位浮点类型
	srcF.convertTo(src, CV_32FC1, 1.0 / 255);
	dst.create(abs(src.rows - smooth.rows) + 1, abs(src.cols - smooth.cols) + 1, src.type());//创建图像与指定模板卷积后的大小Mat

	Size dftSize;
	dftSize.width = getOptimalDFTSize(src.cols + smooth.cols - 1);//获得dft最好的图像大小,(2^3^5^)可能是为了优化执行fft
	dftSize.height = getOptimalDFTSize(src.rows + smooth.rows - 1);
	Mat tempsrc(dftSize, src.type(), Scalar::all(0));//0填充
	Mat tempsmooth(dftSize, smooth.type(), Scalar::all(0));

	Mat roisrc(tempsrc, Rect(0, 0, src.cols, src.rows));//将原图像拷贝到放到尺寸后的图像
	src.copyTo(roisrc);
	Mat roismooth(tempsmooth, Rect(0, 0, smooth.cols, smooth.rows));
	smooth.copyTo(roismooth);

	dft(tempsrc, tempsrc, 0, src.rows);//对模板和图像执行dft
	dft(tempsmooth, tempsmooth, 0, smooth.rows);
	mulSpectrums(tempsrc, tempsmooth, tempsrc, 0, false);//执行卷积
	dft(tempsrc, tempsrc, DFT_INVERSE + DFT_SCALE, dst.rows);//反变换

	tempsrc(Rect(0, 0, dst.cols, dst.rows)).copyTo(dst);//截出需要的图像区域大小

	normalize(dst, dst, 0, 1, NORM_MINMAX);//归一化操作
	imshow("原图", srcF);
	imshow("DFT滤波后", dst);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值