python低通滤波函数 python 低通滤波

【转载】opencv 频域高通、低通滤波演示opencv 理想滤波、巴特沃兹滤波和高斯滤波的高通、低通滤波演示
Filter Parameters 窗口: 滤波器参数窗口
- d0: 滤波器大小 D0
- flag: 滤波器类型
0 - 理想滤波
1 - 巴特沃兹滤波
2 - 高斯滤波
- n: 巴特沃兹滤波的阶数
- lh: 低通滤波 or 高通滤波
Filtered Image 窗口: 过滤后的图像和过滤器图像
#! /usr/bin/env python
#coding=utf-8
importcv2
importnumpy as np
'''
opencv 理想滤波、巴特沃兹滤波和高斯滤波的高通、低通滤波演示
Filter Parameters 窗口: 滤波器参数窗口
- d0: 滤波器大小 D0
- flag: 滤波器类型
0 - 理想滤波
【python低通滤波函数 python 低通滤波】1 - 巴特沃兹滤波
2 - 高斯滤波
- n: 巴特沃兹滤波的阶数
- lh: 低通滤波 or 高通滤波
Filtered Image 窗口: 过滤后的图像和过滤器图像
'''
defcombine_images(images, axis=1):
'''
合并图像 。
@param images: 图像列表(图像成员的维数必须相同)
@param axis: 合并方向 。
axis=0时,图像垂直合并;
axis = 1 时,图像水平合并 。
@return 合并后的图像
'''
ndim =images[0].ndim
shapes =np.array([mat.shape format inimages])
assertnp.all(map(lambdae: len(e)==ndim, shapes)), 'all images should be same ndim.'
ifaxis ==0:# 垂直方向合并图像
# 合并图像的 cols
cols =np.max(shapes[:, 1])
# 扩展各图像 cols大小,使得 cols一致
copy_imgs =[cv2.copyMakeBorder(img, 0, 0, 0, cols-img.shape[1],
cv2.BORDER_CONSTANT, (0,0,0))forimg inimages]
# 垂直方向合并
returnnp.vstack(copy_imgs)
else:# 水平方向合并图像
# 合并图像的 rows
rows =np.max(shapes[:, 0])
# 扩展各图像rows大小 , 使得 rows一致
copy_imgs =[cv2.copyMakeBorder(img, 0, rows-img.shape[0], 0, 0,
cv2.BORDER_CONSTANT, (0,0,0))forimg inimages]
# 水平方向合并
returnnp.hstack(copy_imgs)
deffft(img):
'''对图像进行傅立叶变换,并返回换位后的频率矩阵'''
assertimg.ndim==2, 'img should be gray.'
rows, cols =img.shape[:2]
# 计算最优尺寸
nrows =cv2.getOptimalDFTSize(rows)
ncols =cv2.getOptimalDFTSize(cols)
# 根据新尺寸,建立新变换图像
nimg =np.zeros((nrows, ncols))
nimg[:rows,:cols] =img
# 傅立叶变换
fft_mat =cv2.dft(np.float32(nimg), flags=cv2.DFT_COMPLEX_OUTPUT)
# 换位,低频部分移到中间,高频部分移到四周
returnnp.fft.fftshift(fft_mat)
deffft_image(fft_mat):
'''将频率矩阵转换为可视图像'''
# log函数中加1,避免log(0)出现.
log_mat=cv2.log(1 cv2.magnitude(fft_mat[:,:,0], fft_mat[:,:,1]))
# 标准化到0~255之间
cv2.normalize(log_mat, log_mat, 0, 255, cv2.NORM_MINMAX)
returnnp.uint8(np.around(log_mat))
defifft(fft_mat):
'''傅立叶反变换 , 返回反变换图像'''
# 反换位 , 低频部分移到四周,高频部分移到中间
f_ishift_mat =np.fft.ifftshift(fft_mat)
# 傅立叶反变换
img_back =cv2.idft(f_ishift_mat)
# 将复数转换为幅度, sqrt(re^2im^2)
img_back =cv2.magnitude(*cv2.split(img_back))
# 标准化到0~255之间
cv2.normalize(img_back, img_back, 0, 255, cv2.NORM_MINMAX)
returnnp.uint8(np.around(img_back))
deffft_distances(m, n):
'''
计算m,n矩阵每一点距离中心的距离
见《数字图像处理MATLAB版.冈萨雷斯》93页
'''
u =np.array([i ifi=m/2elsem-i fori inrange(m)], dtype=np.float32)
v =np.array([i ifi=m/2elsem-i fori inrange(m)], dtype=np.float32)
v.shape =n, 1
# 每点距离矩阵左上角的距离
ret =np.sqrt(u*uv*v)
# 每点距离矩阵中心的距离
returnnp.fft.fftshift(ret)
deflpfilter(flag, rows, cols, d0, n):
'''低通滤波器
@param flag: 滤波器类型
0 - 理想低通滤波
1 - 巴特沃兹低通滤波
2 - 高斯低通滤波
@param rows: 被滤波的矩阵高度
@param cols: 被滤波的矩阵宽度
@param d0: 滤波器大小 D0
@param n: 巴特沃兹低通滤波的阶数
@return 滤波器矩阵
'''
assertd00, 'd0 should be more than 0.'
filter_mat =None
#理想低通滤波
ifflag ==0:
filter_mat =np.zeros((rows, cols ,2), np.float32)
cv2.circle(filter_mat, (rows/2, cols/2) , d0, (1,1,1), thickness=-1)
# 巴特沃兹低通滤波
elifflag ==1:
duv =fft_distances(*fft_mat.shape[:2])
filter_mat =1/(1 np.power(duv/d0, 2*n))
# fft_mat有2个通道,实部和虚部
# fliter_mat 也需要2个通道
filter_mat =cv2.merge((filter_mat, filter_mat))
#高斯低通滤波
else:
duv =fft_distances(*fft_mat.shape[:2])
filter_mat =np.exp(-(duv*duv) /(2*d0*d0))
# fft_mat有2个通道,实部和虚部
# fliter_mat 也需要2个通道
filter_mat =cv2.merge((filter_mat, filter_mat))
returnfilter_mat
defhpfilter(flag, rows, cols, d0, n):
'''高通滤波器
@param flag: 滤波器类型
0 - 理想高通滤波
1 - 巴特沃兹高通滤波
2 - 高斯高通滤波
@param rows: 被滤波的矩阵高度
@param cols: 被滤波的矩阵宽度
@param d0: 滤波器大小 D0
@param n: 巴特沃兹高通滤波的阶数
@return 滤波器矩阵
'''
assertd00, 'd0 should be more than 0.'
filter_mat =None
#理想高通滤波
ifflag ==0:
filter_mat =np.ones((rows, cols ,2), np.float32)
cv2.circle(filter_mat, (rows/2, cols/2) , d0, (0,0,0), thickness=-1)
# 巴特沃兹高通滤波
elifflag ==1:
duv =fft_distances(rows, cols)
# duv有 0 值(中心距离中心为0), 为避免除以0,设中心为 0.000001
duv[rows/2, cols/2] =0.000001
filter_mat =1/(1 np.power(d0/duv, 2*n))
# fft_mat有2个通道,实部和虚部
# fliter_mat 也需要2个通道
filter_mat =cv2.merge((filter_mat, filter_mat))
#高斯高通滤波
else:
duv =fft_distances(*fft_mat.shape[:2])
filter_mat =1-np.exp(-(duv*duv) /(2*d0*d0))
# fft_mat有2个通道,实部和虚部
# fliter_mat 也需要2个通道
filter_mat =cv2.merge((filter_mat, filter_mat))
returnfilter_mat
defdo_filter(_=None):
'''滤波,并显示'''
d0 =cv2.getTrackbarPos('d0', filter_win)
flag =cv2.getTrackbarPos('flag', filter_win)
n =cv2.getTrackbarPos('n', filter_win)
lh =cv2.getTrackbarPos('lh', filter_win)
# 滤波器
filter_mat =None
iflh ==0:
filter_mat =lpfilter(flag, fft_mat.shape[0], fft_mat.shape[1], d0, n)
else:
filter_mat =hpfilter(flag, fft_mat.shape[0], fft_mat.shape[1], d0, n)
# 进行滤波
filtered_mat =filter_mat *fft_mat
# 反变换
img_back =ifft(filtered_mat)
# 显示滤波后的图像和滤波器图像
cv2.imshow(image_win, combine_images([img_back, fft_image(filter_mat)]))
if__name__ =='__main__':
img =cv2.imread('images/Fig0515.jpg',0)
rows, cols =img.shape[:2]
# 滤波器窗口名称
filter_win ='Filter Parameters'
# 图像窗口名称
image_win ='Filtered Image'
cv2.namedWindow(filter_win)
cv2.namedWindow(image_win)
# 创建d0 tracker, d0为过滤器大小
cv2.createTrackbar('d0', filter_win, 20, min(rows, cols)/4, do_filter)
# 创建flag tracker,
# flag=0时 , 为理想滤波
# flag=1时,为巴特沃兹滤波
# flag=2时 , 为高斯滤波
cv2.createTrackbar('flag', filter_win, 0, 2, do_filter)
# 创建n tracker
# n 为巴特沃兹滤波的阶数
cv2.createTrackbar('n', filter_win, 1, 5, do_filter)
# 创建lh tracker
# lh: 滤波器是低通还是高通,0 为低通, 1为高通
cv2.createTrackbar('lh', filter_win, 0, 1, do_filter)
fft_mat =fft(img)
do_filter()
cv2.resizeWindow(filter_win, 512, 20)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.[图片]低通图像和滤波器.jpg
3.[图片]滤波器参数.jpg
滤波方法及python实现 对滤波的 总结 : 对特定频率进行有效提取,并对提取部分进行特定的处理(增益,衰减,滤除)的动作被叫做滤波 。
最常用的滤波器类型有三种: 通过式(Pass) , 搁架式(Shelving)和参量式(Parametric) 。滤波器都有一个叫 参考频率(Reference Frequency)的东西 ,在不同类型的滤波器中,具体的叫法会有所不同 。
通过式滤波器可以让参考频率一侧的频率成分完全通过该滤波器 , 同时对另一侧的频率成分做线性的衰减,就是,一边让通过,一边逐渐被滤除 。在信号学中,通过的区域被称为通带 , 滤除的区域被叫做阻带 , 在通过式滤波器中,参考频率通常被称为截止频率 。
高通滤波器(high-pass filters):让截止频率后的高频区域通过,另一侧滤除 , 低通滤波器(low-pass filters):让截止频率前的低频区域通过,另一侧滤除,通
以下是高通滤波器与低通滤波器的核心参数:
截止频率(Cut-off frequency) :决定了通带(通过的频率部分)与阻带(阻止的频率部分)的分界曲线,截止频率的位置并非是在曲线开始弯曲的那个点,而是在-3dB的位置 。以图2左侧的高通滤波器为例,截止频率点之上的部分频率并没有全部被通过,而是有个曲线,在曲线回归平直后其频率才被完全通过 。至于为什么要将-3dB的位置设为截止频率 , 是因为-3dB对于滤波器的设计而言是个非常重要的位置,如果设为其他位置 , 则会让通过式滤波器的设计变得尤为复杂 。
斜率(Slope) :表示的是通带与阻带的分界曲线的倾斜程度,也就是说斜率决定了分界曲线是偏向平缓的,还是偏向垂直的 , 斜率越大(更陡峭),人工处理的痕迹就越明显 。斜率的单位为dB/oct , 中文称为分贝每倍频程 。虽然绕口,但其实很简单,如6dB/oct , 意思为一个倍频程的距离会产生6dB的衰减,数字滤波器常见的斜率选择有6dB/oct,12dB/oct , 18dB/oct,24dB/oct,30dB/oct等等(图3) 。
scipy.signal.filtfilt(b, a, x, axis=-1, padtype='odd', padlen=None, method='pad', irlen=None)
scipy.signal.butter(N, Wn, btype='low', analog=False, output='ba')
这里假设采样频率为1000hz,信号本身最大的频率为500hz,要滤除10hz以下和400hz以上频率成分,即截至频率为10hz和400hz,则wn1=2*10/1000=0.02,wn2=2*400/1000=0.8 。Wn=[0.02,0.8]
python中怎么生成基于窗函数的fir滤波器SciPy提供python低通滤波函数了firwin用窗函数设计低通滤波器python低通滤波函数,firwin的调用形式如下python低通滤波函数:
firwin(N, cutoff, width=None, window='hamming')
其中N为滤波器的长度;cutoff为以正规化的频率;window为所使用的窗函数 。
python如何实现类似matlab的小波滤波?T=wpdec(y,5,'db40');
%信号y进行波包解层数5T波树plot看
a10=wprcoef(T,[1,0]);
?节点[1,0]进行重构信号貌似没层重构说吧能某层某节点进行重构节点编号波树
%以下为滤波程序(主要调节参数c的大?。?
c=10;
wn=0.1;
fs=50000; %采样频率;
b=fir1(c,wn/(fs/2),hamming(c 1));
y1=filtfilt(b,1,y);%对y滤波 。
关于python低通滤波函数和python 低通滤波的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读