基于opencv的理想低通滤波器和巴特沃斯低通滤波器
首先看个图了解下什么是理想低通滤波器公式和图是转自Rolin的专栏
低通滤波器
1.理想的低通滤波器
其中,D0表示通带的半径。D(u,v)的计算方式也就是两点间的距离,很简单就能得到。
使用低通滤波器所得到的结果如下所示。低通滤波器滤除了高频成分,所以使得图像模糊。由于理想低通滤波器的过度特性过于急峻,所以会产生了振铃现象。
2.巴特沃斯低通滤波器
同样的,D0表示通带的半径,n表示的是巴特沃斯滤波器的次数。随着次数的增加,振铃现象会越来越明显。
void ideal_Low_Pass_Filter(Mat src){Mat img;cvtColor(src, img, CV_BGR2GRAY);imshow("img",img);//调整图像加速傅里叶变换int M = getOptimalDFTSize(img.rows);int N = getOptimalDFTSize(img.cols);Mat padded;copyMakeBorder(img, padded, 0, M - img.rows, 0, N - img.cols, BORDER_CONSTANT, Scalar::all(0));//记录傅里叶变换的实部和虚部Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };Mat complexImg;merge(planes, 2, complexImg);//进行傅里叶变换dft(complexImg, complexImg);//获取图像Mat mag = complexImg;mag = mag(Rect(0, 0, mag.cols & -2, mag.rows & -2));//这里为什么&上-2具体查看opencv文档//其实是为了把行和列变成偶数 -2的二进制是11111111.......10 最后一位是0//获取中心点坐标int cx = mag.cols / 2;int cy = mag.rows / 2;//调整频域Mat tmp;Mat q0(mag, Rect(0, 0, cx, cy));Mat q1(mag, Rect(cx, 0, cx, cy));Mat q2(mag, Rect(0, cy, cx, cy));Mat q3(mag, Rect(cx, cy, cx, cy));q0.copyTo(tmp);q3.copyTo(q0);tmp.copyTo(q3);q1.copyTo(tmp);q2.copyTo(q1);tmp.copyTo(q2);//Do为自己设定的阀值具体看公式double D0 = 60;//处理按公式保留中心部分for (int y = 0; y < mag.rows; y++){double* data = mag.ptr<double>(y);for (int x = 0; x < mag.cols; x++){double d = sqrt(pow((y - cy),2) + pow((x - cx),2));if (d <= D0){}else{data[x] = 0;}}}//再调整频域q0.copyTo(tmp);q3.copyTo(q0);tmp.copyTo(q3);q1.copyTo(tmp);q2.copyTo(q1);tmp.copyTo(q2);//逆变换Mat invDFT, invDFTcvt;idft(mag, invDFT, DFT_SCALE | DFT_REAL_OUTPUT); // Applying IDFTinvDFT.convertTo(invDFTcvt, CV_8U);imshow("理想低通滤波器", invDFTcvt);
}void Butterworth_Low_Paass_Filter(Mat src){int n = 1;//表示巴特沃斯滤波器的次数//H = 1 / (1+(D/D0)^2n)Mat img;cvtColor(src, img, CV_BGR2GRAY);imshow("img", img);//调整图像加速傅里叶变换int M = getOptimalDFTSize(img.rows);int N = getOptimalDFTSize(img.cols);Mat padded;copyMakeBorder(img, padded, 0, M - img.rows, 0, N - img.cols, BORDER_CONSTANT, Scalar::all(0));Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };Mat complexImg;merge(planes, 2, complexImg);dft(complexImg, complexImg);Mat mag = complexImg;mag = mag(Rect(0, 0, mag.cols & -2, mag.rows & -2));int cx = mag.cols / 2;int cy = mag.rows / 2;Mat tmp;Mat q0(mag, Rect(0, 0, cx, cy));Mat q1(mag, Rect(cx, 0, cx, cy));Mat q2(mag, Rect(0, cy, cx, cy));Mat q3(mag, Rect(cx, cy, cx, cy));q0.copyTo(tmp);q3.copyTo(q0);tmp.copyTo(q3);q1.copyTo(tmp);q2.copyTo(q1);tmp.copyTo(q2);double D0 = 100;for (int y = 0; y < mag.rows; y++){double* data = mag.ptr<double>(y);for (int x = 0; x < mag.cols; x++){//cout << data[x] << endl;double d = sqrt(pow((y - cy), 2) + pow((x - cx), 2));//cout << d << endl;double h = 1.0 / (1 + pow(d / D0, 2 * n));if (h <= 0.5){data[x] = 0;}else{//data[x] = data[x]*0.5;//cout << h << endl;}//cout << data[x] << endl;}}q0.copyTo(tmp);q3.copyTo(q0);tmp.copyTo(q3);q1.copyTo(tmp);q2.copyTo(q1);tmp.copyTo(q2);//逆变换Mat invDFT, invDFTcvt;idft(complexImg, invDFT, DFT_SCALE | DFT_REAL_OUTPUT); // Applying IDFTinvDFT.convertTo(invDFTcvt, CV_8U);imshow("巴特沃斯低通滤波器", invDFTcvt);
}
基于opencv的理想低通滤波器和巴特沃斯低通滤波器相关推荐
- 5.6.2 低通滤波器(理想低通+巴特沃斯低通滤波器)
1.低通滤波器 低通滤波是将频域图像中的高频部分滤除而通过低频部分.图像的边缘和噪声对应于频域图像中的高频部分,而低通滤波的作用即是减弱这部分的能量,从而达到图像平滑去噪的目的. 2.理想低通滤波器 ...
- 理想低通滤波器、巴特沃斯低通滤波器和高斯低通滤波器
低通滤波器 1.理想的低通滤波器 其中,D0表示通带的半径.D(u,v)的计算方式也就是两点间的距离,很简单就能得到. 使用低通滤波器所得到的结果如下所示.低通滤波器滤除了高频成分,所以使得图像模糊. ...
- 通过matlab编程,对以下图像分别添加高斯噪声和椒盐噪声(参数自定),并使用理想低通滤波器、高斯低通滤波器和巴特沃斯低通滤波器进行去噪。
添加高斯噪声和椒盐噪声,并用理想低通滤波器进行去噪 t=imread('C:\Users\Administrator\Desktop\123.jpg'); subplot(3,2,1) imshow( ...
- 第4章 Python 数字图像处理(DIP) - 频率域滤波10 - 使用低通频率域滤波器平滑图像 - 理想、高斯、巴特沃斯低通滤波器
目录 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 高斯低通滤波器(GLPF) 巴特沃斯低通滤波器 低通滤波的例子 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 在以原点为中心 ...
- 【OpenCV 例程200篇】82. 频率域巴特沃斯低通滤波器
[OpenCV 例程200篇]82. 频率域巴特沃斯低通滤波器 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 3.4 ...
- 巴特沃斯低通滤波器归一化matlab,基于MATLAB设计巴特沃斯低通滤波器
<基于MATLAB设计巴特沃斯低通滤波器>由会员分享,可在线阅读,更多相关<基于MATLAB设计巴特沃斯低通滤波器(6页珍藏版)>请在人人文库网上搜索. 1.基于MATLAB设 ...
- 图像处理之理想高通滤波器、巴特沃斯高通滤波器和高斯高通滤波器的matlab简单实现
一.前言 高通滤波器的功能是让高频率通过而滤掉或衰减低频,其作用是使图像得到锐化处理,突出图像的边界.经理想高频滤波后的图像把信息丰富的低频去掉了,丢失了许多必要的信息**.一般情况下,高通滤波对噪声 ...
- MATLAB:巴特沃斯低通滤波器过滤信号
MATLAB:巴特沃斯低通滤波器过滤信号 实验内容产生两个不同频率的正弦信号,设计合适的滤波器,输出其中的一个信号,滤除另外的一个信号. 代码: %生成两个不同频率的信号 clc; T=2;%时域长度 ...
- 用matlab做巴特沃斯低通滤波器
用matlab做巴特沃斯低通滤波器 趁着暑假,做一个心电图的matlab实验,遇到了滤波器问题,网上代码比较杂乱,做了一个汇总整理. 主要做了一个简单的低通滤波器并以三角函数为例子进行低通滤波. 基本 ...
最新文章
- c语言生成随机坐标,C语言 文件的随机读写详解及示例代码
- SAP 使用ST05跟踪方法
- 数据库MySQL--基础查询
- 2017.9.25 Xor 失败总结
- Python爬虫爬取电影网站种子,让你以后再也不寂寞
- 土壤修复废水除镍技术,除镍树脂材料
- 如何从 Hibernate官网下载 hibernate原码 和hibernatetools
- Intel CPU发展简史
- 注册页面获取手机验证码
- 下行期的资本,正在追逐「猫品牌」
- 只要心存美好便是岁月花开时
- php+ajax实现分页
- 【图形学】18 光照模型(三、镜面反射的Shader实现)
- office365服务器没有响应,修复:由于长时间运行的脚本,Office 365没有响应
- 图文详解 DFS 算法 和 BFS 算法
- SQL DATENAME(month,getdate())返回的数据为英文日期及把日期转为字符去比较的性能问题
- ddd linux 调试工具_Centos安装DDD调试器
- 化合物半导体晶格常数汇总
- jquery图表插件--jqPlot实现柱状图
- SQL基本使用(通俗易懂,适合适合0基础的小伙伴们)