图像频域增强:陷波滤波器
理想陷波滤波器
陷波滤波器可以阻止或允许以某个频率为中心的邻域里的频率通过,所以其在本质上仍然是带阻滤波器或带通滤波器,并且可分别称为
带阻陷波滤波器和带通陷波滤波器。
理想带阻陷波滤波器转移函数为:
H(u,v)={0,D(u,v)<=D01,D(u,v)>D0H(u, v) = \left\{\begin{aligned}&0, D(u, v) <= D_0 \\ &1, D(u, v) > D_0 \end{aligned}\right.H(u,v)={0,D(u,v)<=D01,D(u,v)>D0
- D(u,v)=[(u−u0)2+(v−v0)2]12D(u, v) = [(u - u_0)^2 + (v - v_0)^2]^{\frac{1}{2}}D(u,v)=[(u−u0)2+(v−v0)2]21
带阻陷波滤波器一般是两两工作的,有两个频率中心:
H(u,v)={0,D1(u,v)<=D0orD2(u,v)<=D01,OtherH(u, v) = \left\{\begin{aligned}&0, D_1(u, v) <= D_0 or D_2(u, v) <= D_0 \\ &1, Other \end{aligned}\right.H(u,v)={0,D1(u,v)<=D0orD2(u,v)<=D01,Other
D1(u,v)=[(u−u0)2+(v−v0)2]12D_1(u, v) = [(u - u_0)^2 + (v - v_0)^2]^{\frac{1}{2}}D1(u,v)=[(u−u0)2+(v−v0)2]21
D2(u,v)=[(u−u1)2+(v+v1)2]12D_2(u, v) = [(u - u_1)^2 + (v + v_1)^2]^{\frac{1}{2}}D2(u,v)=[(u−u1)2+(v+v1)2]21
取反后得到陷波带通滤波器。
Numpy陷波滤波:
import cv2 as cv
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
img = cv.imread('./images/R-C.png')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
测试用例:
理想陷波带通、带阻滤波:
def notch_filter(img_gray, u0=0, v0=0, d0=50, ftype='pass'):# 以频谱左上角为坐标原点dft = cv.dft(img_gray.astype('float32'),flags = cv.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft) m, n, _ = dft_shift.shapemask = np.zeros_like(dft_shift)x_arr = np.concatenate([np.arange(m).reshape(m, 1)], axis=1)y_arr = np.concatenate([np.arange(n).reshape(1, n)], axis=0)dist1 = np.sqrt((x_arr - u0)**2 + (y_arr - v0)**2)u1 = m - u0v1 = n - v0dist2 = np.sqrt((x_arr - u1)**2 + (y_arr - v1)**2)mask[dist1 <= d0] = 1mask[dist2 <= d0] = 1if ftype != 'pass':mask = 1 - maskbpf_dft_shift = dft_shift * mask magnitude_spectrum = cv.magnitude(bpf_dft_shift[:,:,0], bpf_dft_shift[:,:,1])log_magnitude_spectrum = 20*np.log(magnitude_spectrum+1)bpf_dft = np.fft.ifftshift(bpf_dft_shift) img_ = cv.idft(bpf_dft) img_bpf = cv.magnitude (img_[:,:,0],img_[:,:,1])return img_bpf, log_magnitude_spectrum
img_1, log_1 = notch_filter(img_gray, u0=0, v0=0, d0=150, ftype='pass')
img_2, log_2 = notch_filter(img_gray, u0=0, v0=0, d0=150, ftype='stop')
img_3, log_3 = notch_filter(img_gray, u0=150, v0=250, d0=150, ftype='pass')
img_4, log_4 = notch_filter(img_gray, u0=150, v0=250, d0=150, ftype='stop')
巴特沃斯陷波带阻滤波器
H(u,v)=11+[D02D1(u,v)D2(u,v)]NH(u, v) = \frac{1}{1 + \left[\frac{{D_0}^2}{D_1(u, v)D_2(u, v)}\right]^N}H(u,v)=1+[D1(u,v)D2(u,v)D02]N1
D1(u,v)=[(u−u0)2+(v−v0)2]12D_1(u, v) = [(u - u_0)^2 + (v - v_0)^2]^{\frac{1}{2}}D1(u,v)=[(u−u0)2+(v−v0)2]21
D2(u,v)=[(u+u0)2+(v+v0)2]12D_2(u, v) = [(u + u_0)^2 + (v + v_0)^2]^{\frac{1}{2}}D2(u,v)=[(u+u0)2+(v+v0)2]21
def bw_notch_filter(img_gray, u0=0, v0=0, d0=50, N=1, ftype='pass'):# 以频谱左上角为坐标原点dft = cv.dft(img_gray.astype('float32'),flags = cv.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft) m, n, _ = dft_shift.shapex_arr = np.concatenate([np.arange(m).reshape(m, 1)], axis=1)y_arr = np.concatenate([np.arange(n).reshape(1, n)], axis=0)dist1 = np.sqrt((x_arr - u0)**2 + (y_arr - v0)**2)dist2 = np.sqrt((x_arr + u0)**2 + (y_arr + v0)**2)mask = 1 / (1. + ((d0**2)/(np.multiply(dist1, dist2)+0.00001))**N)if ftype == 'pass':mask = 1 - maskbpf_dft_shift = dft_shift * mask.reshape(m, n, 1) magnitude_spectrum = cv.magnitude(bpf_dft_shift[:,:,0], bpf_dft_shift[:,:,1])log_magnitude_spectrum = 20*np.log(magnitude_spectrum+1)bpf_dft = np.fft.ifftshift(bpf_dft_shift) img_ = cv.idft(bpf_dft) img_bpf = cv.magnitude (img_[:,:,0],img_[:,:,1])return img_bpf, log_magnitude_spectrum
测试效果:
高斯带阻陷波滤波器
H(u,v)=1−e[−12×D1(u,v)D2(u,v)D02]H(u, v) = 1 - e^{\left[\frac{-1}{2}\times \frac{D_1(u,v)D_2(u,v)}{D_0^2}\right]}H(u,v)=1−e[2−1×D02D1(u,v)D2(u,v)]
def gaussian_notch_filter(img_gray, u0=0, v0=0, d0=50, ftype='pass'):# 以频谱左上角为坐标原点dft = cv.dft(img_gray.astype('float32'),flags = cv.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft) m, n, _ = dft_shift.shapex_arr = np.concatenate([np.arange(m).reshape(m, 1)], axis=1)y_arr = np.concatenate([np.arange(n).reshape(1, n)], axis=0)dist1 = np.sqrt((x_arr - u0)**2 + (y_arr - v0)**2)dist2 = np.sqrt((x_arr + u0)**2 + (y_arr + v0)**2)mask = 1 - np.exp(np.multiply(dist1, dist2)/(d0**2)*(-0.5))if ftype == 'pass':mask = 1 - maskbpf_dft_shift = dft_shift * mask.reshape(m, n, 1) magnitude_spectrum = cv.magnitude(bpf_dft_shift[:,:,0], bpf_dft_shift[:,:,1])log_magnitude_spectrum = 20*np.log(magnitude_spectrum+1)bpf_dft = np.fft.ifftshift(bpf_dft_shift) img_ = cv.idft(bpf_dft) img_bpf = cv.magnitude (img_[:,:,0],img_[:,:,1])return img_bpf, log_magnitude_spectrum
img_1, log_1 = gaussian_notch_filter(img_gray, u0=400, v0=400, d0=100, ftype='pass')
img_2, log_2 = gaussian_notch_filter(img_gray, u0=400, v0=400, d0=100, ftype='stop')
图像频域增强:陷波滤波器相关推荐
- Digital Image processing 数字图像处理最佳陷波滤波器设计(频域)
最佳陷波滤波器(傅里叶变换,matlab实现) 1基本概念 1.1频域滤波步骤小结 在频域中的滤波是简单明了的.它包含如下步骤: (1)给定一幅大小为MN的输入图像f(x,y),选择填充参数P,Q,典 ...
- matlab中陷波滤波器消除,matlab – 找到合适的陷波滤波器以从图像中移除图案
如果您查看图像的fft,您可以清楚地看到导致图像中图案的强频率. 您需要创建一个陷波滤波器,将这些高峰周围的区域归零.我尝试使用高斯陷波滤波器进行此操作,得到的频谱看起来像这样. ifft图像(对比度 ...
- 【OpenCV 例程200篇】90. 频率域陷波滤波器
[OpenCV 例程200篇]90. 频率域陷波滤波器 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 5.2 陷波滤 ...
- 陷波滤波器——周期性降噪
1.正弦噪声(周期噪声) 图像中的周期噪声是在图像获取期间由电力或机电干扰产生的,同时周期噪声可通过频率域滤波来显著地减少.陷波滤波器是处理此类噪声的有效工具. 一个纯正弦波的傅里叶变换是位于正弦波共 ...
- OpenCV 陷波滤波器消除周期性噪音 C++
观察下面图像: 有明显的近似水平线的噪音模式,我们希望他在频率域内的成分沿垂直轴集中: 下图是该图像的谱: 将垂直轴的分量去掉,构建的陷波器如下: 原图与结果图对比: 滤掉的空间噪音模式: 代码实现: ...
- python实现陷波滤波器、低通滤波器、高斯滤波器、巴特沃斯滤波器
在一幅图像中,其低频成分对应者图像变化缓慢的部分,对应着图像大致的相貌和轮廓,而其高频成分则对应着图像变化剧烈的部分,对应着图像的细节(图像的噪声也属于高频成分). 滤波器 低通滤波器 高通滤波器 陷 ...
- matlab 自动生成陷波滤波器算法实现
自动扫描生成陷波滤波器 Function Code function [aOut1,aOut2,aOut3] = optimumNotchFilter(aIn,time,D0,a,b,m) %这仅仅是 ...
- matlab 陷波器,陷波滤波器—matlab实现
个人在处理工程信号的时候,会遇到电信号50Hz及其倍频干扰特别强的情况,如何直接滤掉这些特定信号,而不影响周边有用信号呢,下面,就给大家推荐一个能精确剔除掉指定频率的滤波器--陷波滤波器. input ...
- matlab 设计带阻型陷波滤波器_Q值可调、最大增益恒定的带通滤波器
带通滤波器(BPF)被广泛用于通带非常窄.通带以外任何其它频率被衰减的应用. 公式(1)是带通滤波器的二阶带通传输函数: 其中,K代表恒定的滤波器增益,Q代表滤波器的品质因数. 在H.Martinez ...
- matlab提取电压基波分量,基于复系数陷波滤波器锁相环的电网正序分量检测
摘 要: 为满足在电网电压不平衡情况下的系统控制需求,需要快速而准确地检测出基波正负序分量的幅值和相位.采用无限脉冲响应(IIR)复杂系数陷波滤波器结合锁相环来提取基波分量中的正序分量,利用MATL ...
最新文章
- adv7842自定义方式
- python编辑svg文件_如何使用librsvg Python绑定调整svg映像文件的大小
- 实现AGI,强化学习就够了?Sutton:奖励机制足够实现各种目标
- Asp.net 用户控件和自定义控件注册
- eclipse显示服务器地址,eclipse怎样添加服务器地址
- BZOJ 4555 [Tjoi2016Heoi2016]求和
- centos 安装 py pyhs2
- 弃用MyBatis!我们最终选择了 JDBCTemplate!
- OpenGL绘制一个三角形的实例
- c语言音像图书管理系统设计,c语言--图书管理系统
- java 调试 工具_Java调试器–权威的工具列表
- 拼接符 防注入正则校验_Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)
- 在Linux下查看环境变量
- Mac远程控制软件哪款好用?Remote Desktop manager for mac「专业」
- ViewPager与Tab结合使用
- java 自定义异常实例分析_Java自定义异常类的实例详解
- 基于微博数据的人物性格分类系统
- VMware ESXi 安装教程
- 广东省计算机一级网络题分值,计算机一级考试分值分布
- 大数据在生活中有哪些应用举例?大数据好找工作吗?
热门文章
- atoi函数_linux网络编程之POSIX 消息队列 和 系列函数
- random随机数类
- oracle交叉运算符,Oracle语句优化44个规则详解
- .desktop 桌面快捷_两个按键:手机截屏且保存至电脑桌面
- Div高度自适应内容高度
- 关于sizeof(struct student)的问题
- oracle10g 数据源管理器找不到应用程序,可能是程序没有正确安装问题解决
- springboot 程序发布到tomcat运行
- IBM推出全闪存产品 加速服务器I/O性能
- python--multiprocessing多进程总结