[Python图像处理] 使用高通滤波器实现同态滤波
使用高通滤波器实现同态滤波
- 同态滤波基础
- 实现同态滤波
- 相关链接
同态滤波基础
同态滤波是一种去除图像中乘性噪声的技术,常用于校正图像中的不均匀照明。根据图像形成的光照反射模型,图像 f(x,y)f(x,y)f(x,y) 可以由以下两个分量表征:
- 入射到场景中的光源量
- 场景中对象反射的光量
根据光照反射模型模型,图像中像素的强度(即对象上的点反射的光)是场景照明和场景中对象反射的结果。傅立叶变换在加法下是线性关联的,但在乘法下并不关联。因此,傅立叶方法仅在将噪声作为原始图像的附加项建模时,才适合从图像中去除噪声。
但是,如果图像的缺陷(例如,不均匀的照明)必须建模为乘法而非加法,则直接应用傅立叶变换并不合适。此时,我们便需要使用同态滤波:首先,通过使用对数将乘法转换为加法;然后,使用对数域中的 HPF
来删除低频照明分量,同时保留高频反射率分量。
同态滤波的基本步骤如下,输入图像为 f(x,y)f(x,y)f(x,y),滤波器的输出为 g(x,y)g(x,y)g(x,y):
实现同态滤波
在本节中,我们将学习如何使用 Butterworth HPF
实现同态滤波器。
(1) 首先,导入所需 Python
库,并定义相关函数:
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray
from skimage.filters import sobel, threshold_otsudef dft2(im):freq = cv2.dft(np.float32(im), flags = cv2.DFT_COMPLEX_OUTPUT)freq_shift = np.fft.fftshift(freq)mag, phase = freq_shift[:,:,0], freq_shift[:,:,1]return mag + 1j*phasedef idft2(freq):real, imag = freq.real, freq.imagback = cv2.merge([real, imag])back_ishift = np.fft.ifftshift(back)im = cv2.idft(back_ishift, flags=cv2.DFT_SCALE)im = cv2.magnitude(im[:,:,0], im[:,:,1])return imdef butterworth(sz, D0, n=1):h, w = szu, v = np.meshgrid(range(-w//2,w//2), range(-h//2,h//2)) #, sparse=True)return 1 / (1 + (D0/(0.01+np.sqrt(u**2 + v**2)))**(2*n))
(2) 定义同态滤波函数,频域 H(u,v)H(u,v)H(u,v) 中的同态滤波器如下所示:
H(u,v)=(γH−γL)(11+(D0D(u,v))2n)+γLH(u,v)=(\gamma_H-\gamma_L)(\frac 1 {1+(\frac {D_0} {D(u,v)})^{2n}})+\gamma_L H(u,v)=(γH−γL)(1+(D(u,v)D0)2n1)+γL
为了避免对数域中错误操作,在输入中添加常数 1
,以确保对数的输入始终 ≥1
,最后,从输出中减去 1
:
def homomorphic_filter(im, D0, g_l=0, g_h=1, n=1):im_log = np.log(im.astype(np.float)+1)im_fft = dft2(im_log)H = (g_h - g_l) * butterworth(im.shape, D0, n) + g_l#H = np.fft.ifftshift(H)im_fft_filt = H*im_fft#im_fft_filt = np.fft.ifftshift(im_fft_filt)im_filt = idft2(im_fft_filt)im = np.exp(im_filt.real)-1im = np.uint8(255*im/im.max())return im
(3) 读取输入图像(带有不均匀照明),将其转换为灰度图像(确保像素值在 0-255
范围内),然后通过调函数 homomorphic_filter()
应用同态滤波器。
其中,Butterworth
滤波器 n=2
阶的截止频率为 30
,γL\gamma_LγL 和 γH\gamma_HγH 参数分别设置为 0.3
和 1
:
image = rgb2gray(plt.imread('1.png'))
image_filtered = homomorphic_filter(image, D0=30, n=2, g_l=0.3, g_h=1)
(4) 使用 sobel
滤波器从原始图像中提取边缘,使用 OTSU
最佳阈值创建二值图像如下:
image_edges = sobel(image)
image_edges = image_edges <= threshold_otsu(image_edges)
(5) 使用 sobel
滤波器通过从同态滤波器转换的图像中提取边缘:
image_filtered_edges = sobel(image_filtered)
image_filtered_edges = image_filtered_edges <= threshold_otsu(image_filtered_edges)
(6) 最后,绘制输入图像和使用同态滤波器获得的输出图像,以及提取的边缘:
plt.figure(figsize=(21,17))
plt.gray()
plt.subplots_adjust(0,0,1,0.95,0.01,0.05)
plt.subplot(221), plt.imshow(image), plt.axis('off'), plt.title('original image', size=10)
plt.subplot(222), plt.imshow(image_filtered), plt.axis('off'), plt.title('filtered image', size=10)
plt.subplot(223), plt.imshow(image_edges), plt.axis('off'), plt.title('original image edges', size=10)
plt.subplot(224), plt.imshow(image_filtered_edges), plt.axis('off'), plt.title('filtered image edges', size=10)
plt.show()
输出结果如下所示:
从上图中可以看出,所获得的输出图像中的光照更加均匀,从而可以看清楚原始图像中黑暗区域的细节/边缘。
相关链接
Python图像处理【1】图像与视频处理基础
Python图像处理【2】探索Python图像处理库
Python图像处理【3】Python图像处理库应用
Python图像处理【4】图像线性变换
Python图像处理【5】图像扭曲/逆扭曲
Python图像处理【7】采样、卷积与离散傅里叶变换
[Python图像处理] 使用高通滤波器实现同态滤波相关推荐
- 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- python低通滤波器_[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波
[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波 发布时间:2019-04-28 20:35, 浏览次数:2739 , 标签: Python 该系列文章是讲解Python OpenCV ...
- Python图像处理【10】基于离散余弦变换的图像压缩
基于离散余弦变换的图像压缩 0. 前言 1. 离散余弦变换基础 2. 基于离散余弦变换的图像压缩 3. 图像 JPEG 压缩 3.1 JPEG 压缩原理 3.2 JPEG 压缩实践 小结 系列链接 0 ...
- Python 图像处理实用指南:1~5
原文:Hands-On Image Processing with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...
- 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波
摘要:本文讲解基于傅里叶变换的高通滤波和低通滤波. 本文分享自华为云社区<[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波>,作者:eastmount . 一.高通滤波 傅 ...
- python图像切面numpy_十个Python图像处理工具,不可不知!
原标题:十个Python图像处理工具,不可不知! 这些Python库提供了一种简单直观的方法来转换图像并理解底层数据. 今天的世界充满了数据,图像是这些数据的重要组成部分.但是,在使用它们之前,必须对 ...
- 干货整理!10个Python图像处理工具,入门必看,提效大法
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 在图像处理领域,一库在手,相当于天下已有.但是今天给大家推荐10个好用的库,快来看看有 ...
- python图片-Python图像处理
图像处理 本章工作任务 u 任务1:了解Pillow库的基本操作 u 任务2:掌握图像格式转换 u 任务3:掌握改变图像尺寸 u 任务4:掌握剪裁图像 u 任务5:掌握滤镜处理 本章技能目标及重难点 ...
- python动态图-Python图像处理之gif动态图的解析与合成操作详解
本文实例讲述了Python图像处理之gif动态图的解析与合成操作.分享给大家供大家参考,具体如下: gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图.这里,就介绍下如何使用python ...
最新文章
- Python中函数为什么可以当做参数使用?
- 事物(Jdbc) 例子
- 许昌电气学校电话计算机,许昌电气职业学院
- ***快速理解Docker - 容器级虚拟化解决方案
- asp.net写入日志到文本文件
- 深入理解Javascript闭包
- 用python实现的的手写数字识别器
- python 处理CSV数据
- 【three.js详解之一】入门篇
- 西安石油大学计算机学院于晓,西安石油大学计算机学院2009届本科毕业设计答辩.doc...
- 写了10年的代码,收藏了这20个代码生成框架!太厉害了,以后都不用自己写代码了...
- zookeeper入门篇
- 原生javascript手风琴图片切换案例
- 开源资产管理软件OCS+GLPI安装配置
- iOS攻防 - (十)theos的介绍,安装和使用
- vs code 黑白
- a标签跳转新页面的各种方式
- 微信小程序页面在调取到接口数据之前是加载中状态
- vue 选中列表去重
- [搜片神器]BT种子下载超时很多的问题分析