3.2 Python图像的频域图像增强-高通和低通滤波器

文章目录

  • 3.2 Python图像的频域图像增强-高通和低通滤波器
    • 1 算法原理
      • 1.1理想滤波器
      • 1.2巴特沃斯滤波器
      • 1.3指数滤波器
    • 2 代码
    • 3 效果

1 算法原理

高通和低通滤波器(分别考虑:理想滤波器、巴特沃斯滤波器,指数滤波器)

1.1理想滤波器

顾名思义,高通滤波器为:让高频信息通过,过滤低频信息;低通滤波相反。低频滤波器,顾名思义,就是过滤掉或者大幅度衰减图像的高频成分,让图像的低频成分通过。低频滤波器可以平滑图像,虑去图像的噪声。而与此相反的高频滤波器,则是过滤低频成分,通过高频成分,可以达到锐化图像的目的。理想低通滤波器的滤波非常尖锐,而高斯低通滤波器的滤波则非常平滑。

Butterworth 低通滤波器则介于两者之间,当 Butterworth 低通滤波器的阶数较高时,接近于理想低通滤波器,阶数较低时,则接近于高斯低通滤波器。理想低通滤波器在以原点为圆心、D0 为半径的园内,通过所有的频率,而在圆外截所有的频率。(圆心的频率最低,为变换的直流(dc)分量)。理想的低通滤波器模板为:

其中,D0 表示通带半径,D(u,v)是到频谱中心的距离(欧式距离),计算

公式如下:

M 和 N 表示频谱图像的大小,(M/2,N/2)即为频谱中心。理想的高通滤波器与此相反,1 减去低通滤波模板即可。

1.2巴特沃斯滤波器

巴特沃斯低通滤波器公式:

D0 为截至频率距原点的距离,D(u,v)是点(u,v)距原点的距离不同于 ILPF,BLPF 变换函数在通带与被滤除的频率之间没有明显的截断。当 D(u,v)=D0 时,H(u,v)=0.5(最大值是 1,当 D(u,v)=0)。随着次数的增加,振铃现象会越来越明显。巴特沃斯高通滤波器的形状与巴特沃斯低通滤波器的形状相反,因为高低频率间平滑过渡,因此振铃现象不明显。

巴特沃斯高通滤波器公式:

在公式中,D(u,v)代表频域当中,点(u,v)到中心点的距离,所以中心点也就是 (M/2,N/2),M 和 N 代表图像的长和宽,那么 D(u,v)就可以用下面的式子来表示了:

而 D0 就是截止距离了,就相当于在频域当中画一个圈,对圈内或者圈外保留就可以达到所谓的低通和高通了,这个 D0 就相当于一维当中的截止频率。

1.3指数滤波器

指数低通滤波器公式为:

指数高通滤波器公式为:

2 代码

运行代码说明

1.要改变代码中的图片地址(地址不能有中文)

更改put(path)函数中的路径put(r'../image/image1.jpg')

2.注意最后的plt.savefig('1.new.jpg')是保存plt图像,如果不使用可以注释掉

import osimport numpy as np
import cv2
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 理想低通滤波器
def LowPassFilter(img):"""理想低通滤波器"""# 傅里叶变换dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)fshift = np.fft.fftshift(dft)# 设置低通滤波器rows, cols = img.shapecrow, ccol = int(rows / 2), int(cols / 2)  # 中心位置mask = np.zeros((rows, cols, 2), np.uint8)mask[crow - 20:crow + 20, ccol - 20:ccol + 20] = 1# 掩膜图像和频谱图像乘积f = fshift * mask# 傅里叶逆变换ishift = np.fft.ifftshift(f)iimg = cv2.idft(ishift)res = cv2.magnitude(iimg[:, :, 0], iimg[:, :, 1])return res# 理想高通滤波器
def HighPassFilter(img):"""理想高通滤波器"""# 傅里叶变换f = np.fft.fft2(img)fshift = np.fft.fftshift(f)# 设置高通滤波器rows, cols = img.shapecrow, ccol = int(rows / 2), int(cols / 2)fshift[crow - 2:crow + 2, ccol - 2:ccol + 2] = 0# 傅里叶逆变换ishift = np.fft.ifftshift(fshift)iimg = np.fft.ifft2(ishift)iimg = np.abs(iimg)return iimg# 巴特沃斯低通滤波器
def ButterworthLowPassFilter(image, d, n, s1):"""Butterworth低通滤波器"""f = np.fft.fft2(image)fshift = np.fft.fftshift(f)def make_transform_matrix(d):transform_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))for i in range(transform_matrix.shape[0]):for j in range(transform_matrix.shape[1]):def cal_distance(pa, pb):from math import sqrtdis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)return disdis = cal_distance(center_point, (i, j))transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n))return transform_matrixd_matrix = make_transform_matrix(d)new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))return new_img# 巴特沃斯高通滤波器
def ButterworthHighPassFilter(image, d, n, s1):"""Butterworth高通滤波器"""f = np.fft.fft2(image)fshift = np.fft.fftshift(f)def make_transform_matrix(d):transform_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))for i in range(transform_matrix.shape[0]):for j in range(transform_matrix.shape[1]):def cal_distance(pa, pb):from math import sqrtdis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)return disdis = cal_distance(center_point, (i, j))transform_matrix[i, j] = 1 / (1 + (d / dis) ** (2 * n))return transform_matrixd_matrix = make_transform_matrix(d)new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))return new_img# 指数滤波器
def filter(img, D0, W=None, N=2, type='lp', filter='exponential'):'''频域滤波器Args:img: 灰度图片D0: 截止频率W: 带宽N: butterworth和指数滤波器的阶数type: lp, hp, bp, bs即低通、高通、带通、带阻Returns:imgback:滤波后的图像'''# 离散傅里叶变换dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)# 中心化dtf_shift = np.fft.fftshift(dft)rows, cols = img.shapecrow, ccol = int(rows / 2), int(cols / 2)  # 计算频谱中心mask = np.ones((rows, cols, 2))  # 生成rows行cols列的2纬矩阵for i in range(rows):for j in range(cols):D = np.sqrt((i - crow) ** 2 + (j - ccol) ** 2)if (filter.lower() == 'exponential'):  # 指数滤波器if (type == 'lp'):mask[i, j] = np.exp(-(D / D0) ** (2 * N))elif (type == 'hp'):mask[i, j] = np.exp(-(D0 / D) ** (2 * N))elif (type == 'bs'):mask[i, j] = np.exp(-(D * W / (D ** 2 - D0 ** 2)) ** (2 * N))elif (type == 'bp'):mask[i, j] = np.exp(-((D ** 2 - D0 ** 2) / D * W) ** (2 * N))else:assert ('type error')fshift = dtf_shift * maskf_ishift = np.fft.ifftshift(fshift)img_back = cv2.idft(f_ishift)img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])  # 计算像素梯度的绝对值img_back = np.abs(img_back)img_back = (img_back - np.amin(img_back)) / (np.amax(img_back) - np.amin(img_back))return img_backdef put(path):img = cv2.imread(path, 1)# img = cv2.imread(os.path.join(base, path), 1)img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)f = np.fft.fft2(img)fshift = np.fft.fftshift(f)# 取绝对值后将复数变化为实数 # 取对数的目的是将数据变换到0~255s1 = np.log(np.abs(fshift))# 用以中文显示plt.subplot(331)plt.axis('off')plt.title('原始图像')plt.imshow(img, cmap='gray')plt.subplot(332)plt.axis('off')plt.title('理想低通20')res1 = LowPassFilter(img)plt.imshow(res1, cmap='gray')plt.subplot(333)plt.axis('off')plt.title('理想高通2')res2 = HighPassFilter(img)plt.imshow(res2, cmap='gray')plt.subplot(334)plt.axis('off')plt.title('原始图像')plt.imshow(img, cmap='gray')plt.subplot(335)plt.axis('off')plt.title('巴特沃斯低通20')butter_10_1 = ButterworthLowPassFilter(img, 20, 1, s1)plt.imshow(butter_10_1, cmap='gray')plt.subplot(336)plt.axis('off')plt.title('巴特沃斯高通2')butter_2_1_1 = ButterworthHighPassFilter(img, 2, 1, s1)plt.imshow(butter_2_1_1, cmap='gray')plt.subplot(337)plt.axis('off')plt.title('指数原始图像')plt.imshow(img, cmap='gray')plt.subplot(338)plt.axis('off')plt.title('指数低通图像20')img_back = filter(img, 30, type='lp')plt.imshow(img_back, cmap='gray')plt.subplot(339)plt.axis('off')plt.title('指数高通图像2')img_back = filter(img, 2, type='hp')plt.imshow(img_back, cmap='gray')# plt.savefig('2.new.jpg')plt.show()# 处理函数,要传入路径
put(r'../image/image3.jpg')

3 效果

3.2 Python图像的频域图像增强-高通和低通滤波器相关推荐

  1. 3.3 Python图像的频域图像增强-特殊高通滤波器

    3.3 Python图像的频域图像增强-特殊高通滤波器 文章目录 3.3 Python图像的频域图像增强-特殊高通滤波器 1 算法原理 1.1高频增强滤波器 1.2高频提升滤波器 2 代码 3 效果 ...

  2. 3.1 Python图像的频域图像增强-图像的傅里叶变换和反变换

    3.1 Python图像的频域图像增强-图像的傅里叶变换和反变换 文章目录 3.1 Python图像的频域图像增强-图像的傅里叶变换和反变换 1 算法原理 2 代码 3 效果 1 算法原理 图像的傅里 ...

  3. 3.5 Python图像的频域图像增强-同态滤波器

    3.5 Python图像的频域图像增强-同态滤波器 文章目录 3.5 Python图像的频域图像增强-同态滤波器 1 算法原理 2 代码 3 效果 1 算法原理 同态滤波是一种在频域中同时能够压缩图像 ...

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

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

  5. 数字图像处理-频域滤波-高通/低通滤波

    频域滤波 频域滤波是在频率域对图像做处理的一种方法.步骤如下: 滤波器大小和频谱大小相同,相乘即可得到新的频谱. 滤波后结果显示,低通滤波去掉了高频信息,即细节信息,留下的低频信息代表了概貌.常用的例 ...

  6. android 脸部识别之3D,2018年高通将推出整合3D脸部识别功能的Android手机芯片

    根据国外科技网站CNET的报导,手机芯片大厂高通(Qualcomm)目前打算在针对Android手机设计的处理器产品中,加入支持红外线3D传感技术.也就是说,未来Android手机从处理器方面就会支持 ...

  7. 数字图像处理 - Ch3 锐化(高通)空间滤波器

    数字图像处理 Ch3 锐化(高通)空间滤波器 锐化(高通)空间滤波器 1. 一阶导数和二阶导数 2. 利用二阶导数锐化图像 -- 拉普拉斯 3. 钝化掩蔽和高提升滤波 4. 使用一阶导数锐化图像 -- ...

  8. adreno630gpu参数_高通骁龙AdrenoGPU天梯以及直观分析,推荐。

    GPU性能天梯图高通晓龙系列(标准移动soc搭载的GPU的OpenGL2.0 ES峰值图像性能,基准高通骁龙805Adreno420@600Hz,霸王龙离屏) 4系:(为了直观更为便于理解,所以无论那 ...

  9. [ios版本]AR 现实增强之高通Vuforia QCAR SDK (二)

    [ios版本]AR 现实增强之高通Vuforia QCAR SDK (二) 这章会比较简单.就是换上麦叔叔,不是肯叔叔的logo,然后对着丫照啊照,就能看到茶壶了.为啥是茶壶不是汉堡?因为我没找到汉堡 ...

最新文章

  1. 自动驾驶之多传感器融合-硬件篇(毫米波雷达)
  2. 通过企业分布式缓存共享运行时数据
  3. 6.NFC之非NDEF格式
  4. 【学术相关】科研行业有哪些不为大众所知的内幕?
  5. js ajax通用方法,ajax的四种实现方式介绍
  6. 同步数据流语言代码生成工具的研究进展
  7. 95-130-346-源码-source-kafka相关-KafkaConsumerThread
  8. exescope使用
  9. acs510使用技巧_ABBACS510系列变频器通用接线图和参数表【借鉴实操】
  10. 人民币符号¥单横线?双横线?
  11. android对输入手机号码震动,手机卫士输入框抖动和手机震动效果的实现
  12. Python Day 67 Dango框架图解(总结)、Wsgiref和uwsgi、前后端传输数据的编码格式、From表单和Ajax方式在前端往后端发送文件、补充一下页面清缓存...
  13. JavaScript(WebAPI) (前端)
  14. Win32设计图标、光标样式和窗口标题(简单易懂)
  15. DROID-SLAM: 用于单目双目RGBD相机的深度视觉SLAM
  16. 【Bluetooth|蓝牙开发】二、蓝牙开发入门
  17. HEIF格式怎么转换图片?教你一个小技巧
  18. win10下node.js升级
  19. 【以太网硬件十八】网卡是什么?
  20. remote_message

热门文章

  1. 缠论笔记0-缠论的基本概念
  2. 微信中页面二次分享小图标丢失问题
  3. 芝麻叶泡水的营养价值 芝麻叶泡水的功效与作用
  4. 有线电视模拟信号基础知识
  5. 淘宝开网店的详细教程
  6. 蜘蛛中可能会用到的正则
  7. MicroBlaze软核处理器简介
  8. [技术讨论]运放的共模输入/输出电压设置不对怎么办?
  9. 布隆过滤器简单实现添加和判断功能
  10. 在linux下,如何使得某个目录的下的可执行文件,成为系统级的可执行文件