import cv2
import numpy as np
import matplotlib.pyplot as plt
import math
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号def salt_pepper(image, salt, pepper):"""添加椒盐噪声的图像:param image: 输入图像:param salt: 盐比例:param pepper: 椒比例:return: 添加了椒盐噪声的图像"""height = image.shape[0]width = image.shape[1]pertotal = salt + pepper    #总噪声占比noise_image = image.copy()noise_num = int(pertotal * height * width)for i in range(noise_num):rows = np.random.randint(0, height-1)cols = np.random.randint(0,width-1)if(np.random.randint(0,100)<salt*100):noise_image[rows][cols] = 255else:noise_image[rows][cols] = 0return noise_imagedef low_pass_filtering(image, radius):"""低通滤波函数:param image: 输入图像:param radius: 半径:return: 滤波结果"""# 对图像进行傅里叶变换,fft是一个三维数组,fft[:, :, 0]为实数部分,fft[:, :, 1]为虚数部分fft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)# 对fft进行中心化,生成的dshift仍然是一个三维数组dshift = np.fft.fftshift(fft)# 得到中心像素rows, cols = image.shape[:2]mid_row, mid_col = int(rows / 2), int(cols / 2)# 构建掩模,256位,两个通道mask = np.zeros((rows, cols, 2), np.float32)mask[mid_row - radius:mid_row + radius, mid_col - radius:mid_col + radius] = 1# 给傅里叶变换结果乘掩模fft_filtering = dshift * mask# 傅里叶逆变换ishift = np.fft.ifftshift(fft_filtering)image_filtering = cv2.idft(ishift)image_filtering = cv2.magnitude(image_filtering[:, :, 0], image_filtering[:, :, 1])# 对逆变换结果进行归一化(一般对图像处理的最后一步都要进行归一化,特殊情况除外)cv2.normalize(image_filtering, image_filtering, 0, 1, cv2.NORM_MINMAX)return image_filteringdef high_pass_filtering(image, radius, n):"""高通滤波函数:param image: 输入图像:param radius: 半径:param n: ButterWorth滤波器阶数:return: 滤波结果"""# 对图像进行傅里叶变换,fft是一个三维数组,fft[:, :, 0]为实数部分,fft[:, :, 1]为虚数部分fft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)# 对fft进行中心化,生成的dshift仍然是一个三维数组dshift = np.fft.fftshift(fft)# 得到中心像素rows, cols = image.shape[:2]mid_row, mid_col = int(rows / 2), int(cols / 2)# 构建ButterWorth高通滤波掩模mask = np.zeros((rows, cols, 2), np.float32)for i in range(0, rows):for j in range(0, cols):# 计算(i, j)到中心点的距离d = math.sqrt(pow(i - mid_row, 2) + pow(j - mid_col, 2))try:mask[i, j, 0] = mask[i, j, 1] = 1 / (1 + pow(radius / d, 2*n))except ZeroDivisionError:mask[i, j, 0] = mask[i, j, 1] = 0# 给傅里叶变换结果乘掩模fft_filtering = dshift * mask# 傅里叶逆变换ishift = np.fft.ifftshift(fft_filtering)image_filtering = cv2.idft(ishift)image_filtering = cv2.magnitude(image_filtering[:, :, 0], image_filtering[:, :, 1])# 对逆变换结果进行归一化(一般对图像处理的最后一步都要进行归一化,特殊情况除外)cv2.normalize(image_filtering, image_filtering, 0, 1, cv2.NORM_MINMAX)return image_filteringdef bandpass_filter(image, radius, w, n=1):"""带通滤波函数:param image: 输入图像:param radius: 带中心到频率平面原点的距离:param w: 带宽:param n: 阶数:return: 滤波结果"""# 对图像进行傅里叶变换,fft是一个三维数组,fft[:, :, 0]为实数部分,fft[:, :, 1]为虚数部分fft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)# 对fft进行中心化,生成的dshift仍然是一个三维数组dshift = np.fft.fftshift(fft)# 得到中心像素rows, cols = image.shape[:2]mid_row, mid_col = int(rows / 2), int(cols / 2)# 构建掩模,256位,两个通道mask = np.zeros((rows, cols, 2), np.float32)for i in range(0, rows):for j in range(0, cols):# 计算(i, j)到中心点的距离d = math.sqrt(pow(i - mid_row, 2) + pow(j - mid_col, 2))if radius - w / 2 < d < radius + w / 2:mask[i, j, 0] = mask[i, j, 1] = 1else:mask[i, j, 0] = mask[i, j, 1] = 0# 给傅里叶变换结果乘掩模fft_filtering = dshift * np.float32(mask)# 傅里叶逆变换ishift = np.fft.ifftshift(fft_filtering)image_filtering = cv2.idft(ishift)image_filtering = cv2.magnitude(image_filtering[:, :, 0], image_filtering[:, :, 1])# 对逆变换结果进行归一化(一般对图像处理的最后一步都要进行归一化,特殊情况除外)cv2.normalize(image_filtering, image_filtering, 0, 1, cv2.NORM_MINMAX)return image_filteringdef bandstop_filter(image, radius, w, n=1):"""带通滤波函数:param image: 输入图像:param radius: 带中心到频率平面原点的距离:param w: 带宽:param n: 阶数:return: 滤波结果"""# 对图像进行傅里叶变换,fft是一个三维数组,fft[:, :, 0]为实数部分,fft[:, :, 1]为虚数部分fft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)# 对fft进行中心化,生成的dshift仍然是一个三维数组dshift = np.fft.fftshift(fft)# 得到中心像素rows, cols = image.shape[:2]mid_row, mid_col = int(rows / 2), int(cols / 2)# 构建掩模,256位,两个通道mask = np.zeros((rows, cols, 2), np.float32)for i in range(0, rows):for j in range(0, cols):# 计算(i, j)到中心点的距离d = math.sqrt(pow(i - mid_row, 2) + pow(j - mid_col, 2))if radius - w / 2 < d < radius + w / 2:mask[i, j, 0] = mask[i, j, 1] = 0else:mask[i, j, 0] = mask[i, j, 1] = 1# 给傅里叶变换结果乘掩模fft_filtering = dshift * np.float32(mask)# 傅里叶逆变换ishift = np.fft.ifftshift(fft_filtering)image_filtering = cv2.idft(ishift)image_filtering = cv2.magnitude(image_filtering[:, :, 0], image_filtering[:, :, 1])# 对逆变换结果进行归一化(一般对图像处理的最后一步都要进行归一化,特殊情况除外)cv2.normalize(image_filtering, image_filtering, 0, 1, cv2.NORM_MINMAX)return image_filteringif __name__ == "__main__":image = cv2.imread("..\\images\\lena.jpg", 0)# image_noise = salt_pepper(image, 0.05, 0.05)image_low_pass_filtering5 = low_pass_filtering(image, 50)image_low_pass_filtering1 = low_pass_filtering(image, 10)image_high_pass_filtering5 = high_pass_filtering(image, 50, 1)image_high_pass_filtering1 = high_pass_filtering(image, 10, 1)image_bandpass_filtering5 = bandpass_filter(image, 30, 56, 1)image_bandstop_filtering5 = bandstop_filter(image, 30, 56, 1)plt.subplot(241), plt.imshow(image, 'gray'), plt.title("原图"), plt.xticks([]), plt.yticks([])# plt.subplot(334), plt.imshow(image_noise, 'gray'), plt.title("添加了椒盐噪声的图像"), plt.xticks([]), plt.yticks([])plt.subplot(242), plt.imshow(image_low_pass_filtering5, 'gray'), plt.title("半径为50像素的低通滤波"), plt.xticks([]), plt.yticks([])plt.subplot(246), plt.imshow(image_low_pass_filtering1, 'gray'), plt.title("半径为10像素的低通滤波"), plt.xticks([]), plt.yticks([])plt.subplot(243), plt.imshow(image_high_pass_filtering5, 'gray'), plt.title("半径为50像素的高通滤波"), plt.xticks([]), plt.yticks([])plt.subplot(247), plt.imshow(image_high_pass_filtering1, 'gray'), plt.title("半径为10像素的高通滤波"), plt.xticks([]), plt.yticks([])plt.subplot(244), plt.imshow(image_bandpass_filtering5, 'gray'), plt.title("带通滤波"), plt.xticks([]), plt.yticks([])plt.subplot(248), plt.imshow(image_bandstop_filtering5, 'gray'), plt.title("带阻滤波"), plt.xticks([]), plt.yticks([])plt.show()

OpenCV-python 实现低通滤波、高通滤波、带通滤波相关推荐

  1. python源码 高通滤波、低通滤波、带通滤波

    创作不易,如果此文使您有收获,记得点赞哦! 一. 傅里叶变化原理: https://www.cnblogs.com/wojianxin/p/12529809.html 二. 高通滤波.低通滤波.带通滤 ...

  2. 低通采样和带通采样定理

    耐奎斯特采样定理 [2] :我们假设有一个 时间连续信号  x(t)的频带在(0, f H )之间,以采 样速率为连续信号频率 2 倍(f s =2f H)的采 样速率对 x(t)进行等间隔采样,得到 ...

  3. matlab 理想带通,matlab理想带通滤波

    理想带通使用如下函数,dim是维度,如果input是一维,则dim=1 % FILTERED = ideal_bandpassing(INPUT,DIM,WL,WH,SAMPLINGRATE) % % ...

  4. Python绘制傅里叶变换、反变换与带通滤波图像

    功能描述: 给定信号,对其进行傅里叶变换然后再进行反变换,绘制原始信号.傅里叶变换.傅里叶反变换的结果图像.给定信号,滤除其中某个频率范围的信号,绘制图像. 参考代码: 运行结果:

  5. OpenCV Python学习笔记(5)—— 边缘保留滤波(EPF)

    1 边缘保留滤波 高斯双边 均值迁移 2 测试 import cv2 as cv import numpy as npdef bi_demo(image):dst = cv.bilateralFilt ...

  6. OpenCV —— 频率域滤波(傅里叶变换,低通和高通滤波,带通和带阻滤波,同态滤波)

    频率域滤波 基本概念 傅里叶变换 二维离散的傅里叶变换 快速傅里叶变换 傅里叶幅度谱与相位谱 谱残差显著性检测 卷积与傅里叶变换的 频率域滤波 低通滤波和高通滤波 带通和带阻滤波 同态滤波 基本概念 ...

  7. OPenCV:傅里叶变换、时域和频域、频谱和相位谱、傅里叶级数、离散傅里叶变换(DFT)、频域滤波、高通和低通滤波器、带通和带阻滤波器

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 快速了解傅立叶变换(播放PPT即能动态地显示gif图)    ...

  8. matlab实现低通、高通、带通、带阻滤波

    MATLAB滤波常用函数 模拟滤波器阶数选择函数 buttord 功能:计算butterworth模拟滤波器的阶数 调用格式: [n,Wn]=buttord(Wp,Ws,Rp,Rs,'s'); % 参 ...

  9. C# FIR滤波器(含低通、高通、带通、带阻)

    最近需要用到Fir滤波器,在网上也看了不少资料,发现一个稍微能用的(https://blog.csdn.net/BIGFatming/article/details/92386914),主要代码也是直 ...

  10. FIR滤波器,低通、高通、带通、带阻VC实现

    1.前言:数字信号处理相关知识准备 通常来说,一种理想滤波器的频率响应是很容易理解的,如图所示.   图1 滤波器频响 以低通为例,滤波器频率响应函数为 . 所谓滤波器处理的过程,简单来说,可以用公式 ...

最新文章

  1. struts2 与 sping 整合 控制器中 service注入的问题
  2. java 解释型和编译型
  3. 应对电信劫持强行插入广告的处理
  4. Python爬虫开发:url中文字符编码的两种解决方式
  5. 使用CSS实现图片未加载完成时占位显示
  6. libjpeg-turbo(2)
  7. shiro 解决 跨域(仅端口不同) 登陆 问题
  8. web前端之js快速入门(ECMAscript)
  9. 关于整合SK框架的一些个小注意
  10. 利用dex2jar反编译apk
  11. 使用python中正则表达式匹配linux ifconifg命令中的具体信息
  12. Win7性能优化:解决多核处理器兼容问题
  13. 使用wireshark抓包软件分析微信协议--zucc
  14. 微信小程序tabBar不显示问题
  15. [Git]删除git文件历史记录
  16. 中企海外周报 | 宁德时代与大众拉美卡客车达成合作;亿航与沃达丰共建欧洲城市空中交通生态...
  17. 知道创宇发布统一云防御,“开明兽”亮相“山海·创”
  18. Ubuntu Linux 系统 键盘错乱 ,按键与输出不一致
  19. pentaho-server 与 Pentaho Data Integration(pentaho-kettle)
  20. Async await的使用

热门文章

  1. BuildMSI.vbs 生成MSI中间件 并通过连接生成MSI包
  2. Python(算法综合)问题 D: 兵贵神速-快速排序
  3. 5G核心网基础架构确认,采用中国26家企业联合提出的SBA架构
  4. EFM32 LEUART
  5. Advanced Programming: Unity Game Dev Course(4)-Closing the Loop
  6. Windows 8: 将英文系统转换为中文
  7. 使用jsmsengine开发短信息发送软件
  8. vue+three+layui 实现后台登陆页面
  9. 算法工程师是做什么的?超高薪资的背后,存在着什么样的原因?
  10. 使windows和linux中的ubuntu位于同一网段