使用高通滤波器实现同态滤波

  • 同态滤波基础
  • 实现同态滤波
  • 相关链接

同态滤波基础

同态滤波是一种去除图像中乘性噪声的技术,常用于校正图像中的不均匀照明。根据图像形成的光照反射模型,图像 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.31

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图像处理] 使用高通滤波器实现同态滤波相关推荐

  1. 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  2. python低通滤波器_[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波

    [Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波 发布时间:2019-04-28 20:35, 浏览次数:2739 , 标签: Python 该系列文章是讲解Python OpenCV ...

  3. Python图像处理【10】基于离散余弦变换的图像压缩

    基于离散余弦变换的图像压缩 0. 前言 1. 离散余弦变换基础 2. 基于离散余弦变换的图像压缩 3. 图像 JPEG 压缩 3.1 JPEG 压缩原理 3.2 JPEG 压缩实践 小结 系列链接 0 ...

  4. Python 图像处理实用指南:1~5

    原文:Hands-On Image Processing with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...

  5. 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

    摘要:本文讲解基于傅里叶变换的高通滤波和低通滤波. 本文分享自华为云社区<[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波>,作者:eastmount . 一.高通滤波 傅 ...

  6. python图像切面numpy_十个Python图像处理工具,不可不知!

    原标题:十个Python图像处理工具,不可不知! 这些Python库提供了一种简单直观的方法来转换图像并理解底层数据. 今天的世界充满了数据,图像是这些数据的重要组成部分.但是,在使用它们之前,必须对 ...

  7. 干货整理!10个Python图像处理工具,入门必看,提效大法

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 在图像处理领域,一库在手,相当于天下已有.但是今天给大家推荐10个好用的库,快来看看有 ...

  8. python图片-Python图像处理

    图像处理 本章工作任务 u 任务1:了解Pillow库的基本操作 u 任务2:掌握图像格式转换 u 任务3:掌握改变图像尺寸 u 任务4:掌握剪裁图像 u 任务5:掌握滤镜处理 本章技能目标及重难点 ...

  9. python动态图-Python图像处理之gif动态图的解析与合成操作详解

    本文实例讲述了Python图像处理之gif动态图的解析与合成操作.分享给大家供大家参考,具体如下: gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图.这里,就介绍下如何使用python ...

最新文章

  1. Python中函数为什么可以当做参数使用?
  2. 事物(Jdbc) 例子
  3. 许昌电气学校电话计算机,许昌电气职业学院
  4. ***快速理解Docker - 容器级虚拟化解决方案
  5. asp.net写入日志到文本文件
  6. 深入理解Javascript闭包
  7. 用python实现的的手写数字识别器
  8. python 处理CSV数据
  9. 【three.js详解之一】入门篇
  10. 西安石油大学计算机学院于晓,西安石油大学计算机学院2009届本科毕业设计答辩.doc...
  11. 写了10年的代码,收藏了这20个代码生成框架!太厉害了,以后都不用自己写代码了...
  12. zookeeper入门篇
  13. 原生javascript手风琴图片切换案例
  14. 开源资产管理软件OCS+GLPI安装配置
  15. iOS攻防 - (十)theos的介绍,安装和使用
  16. vs code 黑白
  17. a标签跳转新页面的各种方式
  18. 微信小程序页面在调取到接口数据之前是加载中状态
  19. vue 选中列表去重
  20. [搜片神器]BT种子下载超时很多的问题分析

热门文章

  1. java 拦截器HandlerInterceptor 自定义返回结果
  2. js调用摄像头拍照并访问后端代码
  3. 栈的思想解决火车出站问题
  4. 通信工程计算机程序设计要求高吗,通信工程职生涯规划书.docx
  5. 2023 莲匸AI网站系统PHP源码
  6. SQLPrompt 激活使用
  7. 为什么qt改不了ui的字体_为您的UI选择最佳字体
  8. 用SQL语句删除数据库重复数据,只保留一条有效数据
  9. 【Let It Be Color!——3D重建之纹理重建】02-基于映射的纹理重建算法(上)
  10. 【大学物理·静止电荷的电场】静电场中的电介质