Opencv实现的陷波滤波器
在本示例中,共设计了三个函数,分别是巴特沃斯滤波器BLPF()、巴特沃斯陷波滤波器notchFilter_BTW()、高斯陷波滤波器notchFilter_GAUSS()
巴特沃斯陷波滤波器参见书上6.4.5选择性滤波器,高斯陷波滤波器参照6.3.3节中的高斯低通滤波器。
参数说明:
rows——滤波器的行数;
cols——滤波器的列数;
D0——频域截止半径;
n——巴特沃斯的阶数;
cvtype——滤波器的数据类型和通道数,默认为双通道浮点数
Mat BLPF(int rows,int cols,float D0,int n=,int cvtype=CV_32FC2)
{
Mat filt(rows,cols,cvtype,Scalar::all());
int cx=cols/,cy=rows/;
float D02=D0*D0;
for(int i=;i<rows;i++)
{
for(int j=;j<cols;j++)
{
int u=cx-j,v=cy-i;//中心坐标
float Duv2=u*u+v*v;//距离中心半径的平方
float H0=-/(+pow(Duv2/D02,n));
int u1=u-,v1=v-;
float D2=u1*u1+v1*v1;
float H1=-/(+pow(D2/D02,n));
//.data返回的是uchar*型指针,所以要强制转换成浮点数型
float* p=(float*)(filt.data+i*filt.step[]+j*filt.step[]); for(int c=;c<filt.channels();c++)
{
p[c]=H1*H0;
} }
}
return filt;
} Mat notchFilter_BTW(int rows,int cols,std::vector<cv::Point> np,
float* D,int n=,int cvtype=CV_32FC2)
{
Mat filt(rows,cols,cvtype,Scalar::all());
int cx=cols/,cy=rows/;
int numNotch=np.size();
float* D2=D;
for(int i=;i<numNotch;i++)
{
D2[i]=D[i]*D[i];
}
int uk[numNotch],vk[numNotch];//在画面上的实际陷波坐标点
int u_k[numNotch],v_k[numNotch];//陷波共轭点
float Dk[numNotch],D_k[numNotch];//陷波半径r
float Hk[numNotch],H_k[numNotch]; for(int i=;i<rows;i++)
{
for(int j=;j<cols;j++)
{
int u=cx-j,v=cy-i;//中心坐标
for(int s=;s<numNotch;s++)
{
uk[s]=u+np[s].x,vk[s]=v+np[s].y;
Dk[s]=uk[s]*uk[s]+vk[s]*vk[s];//距离中心半径的平方
Hk[s]=-/(+pow(Dk[s]/D2[s],n)); u_k[s]=u-np[s].x,v_k[s]=v-np[s].y;
D_k[s]=u_k[s]*u_k[s]+v_k[s]*v_k[s];
H_k[s]=-/(+pow(D_k[s]/D2[s],n));
}
//.data返回的是uchar*型指针,所以要强制转换成浮点数型
float* p=(float*)(filt.data+i*filt.step[]+j*filt.step[]); for(int c=;c<filt.channels();c++)
{
p[c]=Hk[]*H_k[];
for(int k=;k<numNotch;k++)
{
p[c]*=Hk[k]*H_k[k];
}
} }
}
return filt;
}
Mat notchFilter_GAUSS(int rows,int cols,std::vector<cv::Point> np,
float* D,int cvtype=CV_32FC2)
{
Mat filt(rows,cols,cvtype,Scalar::all());
int cx=cols/,cy=rows/; // float D02=D0*D0;
int numNotch=np.size();
float* D2=D;
for(int i=;i<numNotch;i++)
{
D2[i]=D[i]*D[i];
}
int uk[numNotch],vk[numNotch];//在画面上的实际陷波坐标点
int u_k[numNotch],v_k[numNotch];//陷波共轭点
float Dk[numNotch],D_k[numNotch];//陷波半径r
float Hk[numNotch],H_k[numNotch]; for(int i=;i<rows;i++)
{
for(int j=;j<cols;j++)
{
int u=cx-j,v=cy-i;//中心坐标
for(int s=;s<numNotch;s++)
{
uk[s]=u+np[s].x,vk[s]=v+np[s].y;
Dk[s]=uk[s]*uk[s]+vk[s]*vk[s];//距离中心半径的平方
Hk[s]=-exp(-Dk[s]/(D2[s]*)); u_k[s]=u-np[s].x,v_k[s]=v-np[s].y;
D_k[s]=u_k[s]*u_k[s]+v_k[s]*v_k[s];
H_k[s]=-exp(-D_k[s]/(D2[s]*));
}
//.data返回的是uchar*型指针,所以要强制转换成浮点数型
float* p=(float*)(filt.data+i*filt.step[]+j*filt.step[]); for(int c=;c<filt.channels();c++)
{
p[c]=Hk[]*H_k[];
for(int k=;k<numNotch;k++)
{
p[c]*=Hk[k]*H_k[k];
}
} }
}
return filt;
} int main()
{
Point np[]={Point(,),Point(,),Point(,),Point(,)};//输入陷波坐标数组
vector<Point> vnp(np,np+);
float D[]={,,,};
// Mat filt1=notchFilter_BTW(500,600,vnp,D,2);
Mat filt1=notchFilter_GAUSS(,,vnp,D);
Mat fc1;
extractChannel(filt1,fc1,);
imshow("filter ",fc1); waitKey();
return ;
}
高斯陷波滤波器的演示实例结果如下:
下面是巴特沃斯陷波滤波器的演示结果:
Opencv实现的陷波滤波器的更多相关文章
- 双T型陷波滤波器
有时,我们需要设计个滤波器滤除特定一个频率的噪音.这时就需要陷波滤波器了. 陷波器是带阻滤波器的一种,带阻滤波器的滤除频率有一定宽度,而陷波就是对某一个频率噪音的滤除. 双T型陷波滤波器应该是最常见的 ...
- OpenCV 实现自己的线性滤波器
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #i ...
- Opencv 3入门(毛星云)摘要
第一章 环境搭建: 1. 环境变量path 添加 D:\Program Files\opencv\build\x86\vc11\bin 2. VS在VC++项目中,属性管理器\属性. VC++目 ...
- 图像滤波与OpenCV中的图像平滑处理
.About图像滤波 频率:可以这样理解图像频率,图像中灰度的分布构成一幅图像的纹理.图像的不同本质上是灰度分布规律的不同.但是诸如"蓝色天空"样的图像有着大面积近似的灰度强度,而 ...
- 学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波
本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤 ...
- OpenCV3编程入门.知识点
1. 第三部分 掌握 imgproc 组件 第六章 图像处理 6.1.线性滤波: Pdf.P170 Pdf.P171 平滑处理(smoothing)(模糊处理(bluring))-- 使用频率很高 - ...
- 音频DAC剖析---解开HI-FI音质的秘密
选自:http://mp3.zol.com.cn/54/547689.html 无论我们是买MP3.MP4也好,实际上我们的数码播放器最经常使用的就是音乐播放功能,所以数码播放器的音质,一直是消费者的 ...
- paper 108:系统学习数字图像处理之图像复原与重建
首先,必须注意这里所限制的处理条件. 关于图像退化/复原模型 退化的图像是由成像系统的退化加上额外的噪声形成的. 1.只考虑噪声引起的退化 噪声模型,包含于空间不相关和相关两种,除了空间周期噪声,这里 ...
- Android FM模块学习之四源码学习(2)
前几章我们分析了FM模块的几个主要的类文件,今天要分析的是:FMTransceiver.java // 某些工程中名称为FMRadioService.java public class FmTra ...
随机推荐
- python: 错误处理try详解 ,traceback调用栈, 调试(logging)
摘录:https://www.liaoxuefeng.com/wiki/1016959663602400/1017598873256736 错误处理 调试 错误处理 高级语言都会使用内置的一套try. ...
- python中open与with open的区别
读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的.在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开 ...
- php类知识点滴---类的实例化,构造函数,继承初步
实例化类----黑科技用法,通过字符串来实例化 class coach { public function __construct() { echo "欢迎光临北武堂"." ...
- Python设置浏览器宽高
# 发起请求,设置浏览器宽高 # 代码中引入selenium版本为:3.4.3 # 通过Chrom浏览器访问发起请求 # Chrom版本:59 ,chromdriver:2.3 # 需要对应版本的Ch ...
- BZOJ 4031: [HEOI2015]小Z的房间 (矩阵树定理 板题)
背结论 : 度-邻 CODE1 O(n3logn)O(n^3logn)O(n3logn) #include <bits/stdc++.h> using namespace std; typ ...
- ip 转发(调度器的路由转发)
临时开启 [root@proxy ~]# echo > /proc/sys/net/ipv4/ip_forward 永久开启 [root@proxy ~]# vim /etc/sysctl.co ...
- .NET面试题系列(22)字符串暂存池(缓冲池)
序言 字符串不可变性,字符串的‘暂存池’两个特性 字符串是引用类型,程序中会存在大量的字符串对象,如果每次都创建一个字符串对象,会比较浪费内存.性能低,因此CLR做了“暂存池”(拘留池,缓冲池,暂存池 ...
- rander()函数执行条件
调用this.setState({}),如果数据改变了,rander()就行执行
- Confluence 6 在一个空间中查看所有附加的文件
有下面 2 种方法可以让你查看空间的所有附件.你可以: 使用 Space Attachments Macro 来在一个页面中显示列表文件. 进入空间后,然后从边栏的底部选择 空间工具(Space to ...
- 中国剩余定理及其拓展 CRT&EXGCD
中国剩余定理,又叫孙子定理. 作为一个梗广为流传.其实它的学名叫中国单身狗定理. 中国剩余定理 中国剩余定理是来干什么用的呢? 其实就是用来解同余方程组的.那么什么又是同余方程组呢. 顾名思义就是n个 ...