当前位置: 首页 > news >正文

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

使用高通滤波器实现同态滤波同态滤波基础实现同态滤波相关链接同态滤波基础 同态滤波是一种去除图像中乘性噪声的技术&#xff0c;常用于校正图像中的不均匀照明。根据图像形成的光照反射模型&#xff0c;图像 f(x,y)f(x,y)f(x,y) 可以由以下两个分量表征&#xff1a; 入射到…...

PyTorch深度学习:60分钟入门

PyTorch深度学习&#xff1a;60分钟入门 本教程的目的: 更高层级地理解PyTorch的Tensor库以及神经网络。训练一个小的神经网络来对图像进行分类。 本教程以您拥有一定的numpy基础的前提下展开 Note: 务必确认您已经安装了 torch 和 torchvision 两个包。 这是一个基于Pytho…...

C语言指针常见问题汇总

我们在学C语言时&#xff0c;指针是我们最头疼的问题之一&#xff0c;针对C语言指针&#xff0c;博主根据自己的实际学到的知识以及开发经验&#xff0c;总结了以下使用C语言指针时常见问题。 1、指针做函数参数 学习函数的时候&#xff0c;讲了函数的参数都是值拷贝&#xf…...

Coremail邮件系统全新上线存档邮箱功能

邮箱积累邮件太多&#xff0c;搜索起来又慢又麻烦&#xff01; 我的重要邮件忘记下载丢失了&#xff01;14天自动删除太难了&#xff01; 有没有可能重要邮件自动存档&#xff0c;解救一下“遗忘星”人&#xff1f; 在我们日常工作中&#xff0c;邮件是最经常使用的办公工具之一…...

Python绘图

1.二维绘图 a. 一维数据集 用 Numpy ndarray 作为数据传入 ply 1. import numpy as np import matplotlib as mpl import matplotlib.pyplot as pltnp.random.seed(1000) y np.random.standard_normal(10) print "y %s"% y x range(len(y)) print "x%s&q…...

【独家】华为OD机试 - 第K个最小码值的字母(C 语言解题)

最近更新的博客 华为od 2023 | 什么是华为od&#xff0c;od 薪资待遇&#xff0c;od机试题清单华为OD机试真题大全&#xff0c;用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析经验分享,题型分享,防作弊指南&#xff09;华为od机试&#xff0c;独家整理 已参加机试…...

整数反转(python)

题目链接&#xff1a; https://leetcode.cn/problems/reverse-integer/ 题目描述&#xff1a; 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231,231−1][−2^{31}, 2^{31} − 1][−231,231…...

【数据结构】二叉树与堆

文章目录1.树概念及结构1.1树的相关概念1.2树的结构2.二叉树概念及结构2.1相关概念2.2特殊的二叉树2.3二叉树的性质2.4二叉树的存储结构3.二叉树的顺序结构及实现3.1二叉树的顺序结构3.2堆的概念3.3堆的实现Heap.hHeap.c3.4堆的应用3.4.1 堆排序3.4.2 TOP-KOJ题最小K个数4.二叉…...

Git图解-常用命令操作-可视化

目录 一、前言 二、初始化仓库 2.1 设置用户名与邮箱 2.2 初始化仓库 三、添加文件 四、查看文件状态 五、查看提交日志 六、查看差异 七、版本回退 八、删除文件 九、分支管理 9.1 创建分支 9.2 切换分支 9.3 查看分支 9.4 合并分支 十、文件冲突 十一、转视…...

C语言-基础了解-20-typedef

typedef 一、typedef C 语言提供了 typedef 关键字&#xff0c;您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE&#xff1a; typedef unsigned char BYTE; 在这个类型定义之后&#xff0c;标识符 BYTE 可作为类型 unsigned char 的缩写&…...

Ubuntu系统升级16.04升级18.04

一、需求说明 作为Linux发行版中的后起之秀&#xff0c;Ubuntu 在短短几年时间里便迅速成长为从Linux初学者到实验室用计算机/服务器都适合使用的发行版&#xff0c;目前官网最新版本是22.04。Ubuntu16.04是2016年4月发行的版本&#xff0c;于2019年4月停止更新维护。很多软件支…...

CM6.3.2启用Kerberos(附问题解决)

基础准备支持JCE的jdk重新安装JCE的jdk(已正确配置跳过)删除/usr/java/下面的jdk,然后通过CM->管理->安全->安装Java无限制...重新安装后,配置Java(可选)主机->主机配置->搜java->Java主目录 配置路径主机->所有主机->设置->高级:Java配置Kerberos安…...

QML 动画(组合动画)

在QML中&#xff0c;可以把多个动画组合成一个单一的动画。 组合动画的类型&#xff1a; ParallelAnimation 动画同时进行&#xff08;并行&#xff09;SequentialAnimation 动画按照顺序执行&#xff08;顺序执行&#xff09;注意&#xff1a;将动画分组为“顺序动画”或“…...

【PHP代码注入】PHP代码注入漏洞

漏洞原理RCE为两种漏洞的缩写&#xff0c;分别为Remote Command/Code Execute&#xff0c;远程命令/代码执行PHP代码注入也叫PHP代码执行(Code Execute)(Web方面)&#xff0c;是指应用程序过滤不严&#xff0c;用户可以通过HTTP请求将代码注入到应用中执行。代码注入(代码执行)…...

Python 常用语句同C/C++、Java的不同

文章目录前言1. 数字 int2. 字符 string3. 列表 List4. 元组 tuple5. 字典 dictionary6. 集合 set7. 值类型变量与引用类型变量8. if elif else9. >、<、>、<、、!10. while11. for前言 本篇为本人前段时间的一个简单汇总&#xff0c;这里可能并不齐全&#xff0c…...

一把火烧掉了苹果摆脱中国制造的幻想,印度制造难担重任

这几年苹果不断推动印度制造&#xff0c;希望摆脱对中国制造的依赖&#xff0c;然而近期苹果在印度的一家代工厂发生大火却证明了苹果的这一计划遭受重大打击&#xff0c;印度制造根本就无法中国制造。一、印度制造屡屡发生幺蛾子苹果推动印度制造已有多年了&#xff0c;然而印…...

常用的 JavaScript 数组 API

以下是一些常用的 JavaScript 数组 API 的代码示例&#xff1a; 1、push() push(): 在数组末尾添加一个或多个元素&#xff0c;返回新的数组长度 const arr [1, 2, 3]; const newLength arr.push(4, 5); console.log(arr); // [1, 2, 3, 4, 5] console.log(newLength); //…...

海思3531a pjsip交叉编译

学习文档&#xff1a; PJSUA2 Documentation — PJSUA2 Documentation 1.0-alpha documentationhttps://www.pjsip.org/docs/book-latest/html/index.html ./configure --prefix/opensource/pjproject-2.12/build3531a \ --host/opt/hisi-linux/x86-arm/arm-hisi…...

《安富莱嵌入式周报》第305期:超级震撼数码管瀑布,使用OpenAI生成单片机游戏代码的可玩性,120通道逻辑分析仪,复古电子设计,各种运动轨迹函数源码实现

往期周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 说明&#xff1a; 谢谢大家的关注&#xff0c;继续为大家盘点上周精彩内容。 视频版&#xff1a; https://www.bi…...

力扣-查找每个员工花费的总时间

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1741. 查找每个员工花费的总时间二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行…...

企业级信息系统开发学习笔记1.8 基于Java配置方式使用Spring MVC

文章目录零、本节学习目标一、基于Java配置与注解的方式使用Spring MVC1、创建Maven项目 - SpringMVCDemo20202、在pom.xml文件里添加相关依赖3、创建日志属性文件 - log4j.properties4、创建首页文件 - index.jsp5、创建Spring MVC配置类 - SpringMvcConfig6、创建Web应用初始…...

【C语言复习】C语言中的文件操作

C语言中的文件操作写在前面文件操作什么是文件文件的分类文件名文件的操作文件指针文件的打开和关闭文件的顺序读写文件的随机读写fseekftellrewindfeof写在前面 文件操作在C语言部分只是属于了解内容&#xff0c;但是因为它可能会应用在项目中&#xff0c;所以我把它单独写成…...

00后整顿职场,当摸鱼测试员遇上了内卷00后。

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…...

程序员的上帝视角(4)——视角

对于开发人员来说&#xff0c;工作都是从评估一个需求开始。我们第一个要解决的问题就是看待需求的视角。视角的不同&#xff0c;得到的设计方案可能是完全不同的。作为一个程序员&#xff0c;不能单单从个人视角来看待问题。而是要尝试从不同角色出发&#xff0c;不停思考。上…...

一、webpack基础

webpack基础 一、webpack是什么 webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。 说白了webpack就是一个构建和管理静态资源的工具&#xff0c;在我们使用框架开发时&#xff0c;它会在我们内部的一个或者多个入口根据我们引入的各个模块将他们根据一定的规…...

超详细VMware CentOS7(最小安装)安装教程

前言&#xff1a;在我们使用虚拟机的时候&#xff0c;不要去担心我们的一些操作会使虚拟机损坏或者有没有可能会使我们的电脑本身出现一些问题&#xff0c;要记住无论我们把我们的虚拟机如何都不会影响我们本身的机器&#xff0c;因为它只是虚拟的&#xff0c;在虚拟机里不要担…...

经典卷积模型回顾8—NIN实现图像分类(matlab)

首先&#xff0c;介绍一下NiN&#xff08;Network In Network&#xff09;模型。NiN模型是由加州大学伯克利分校的Lin、Chen、Yan等人在2013年提出的一种深度卷积神经网络模型&#xff0c;其特点是在传统的卷积神经网络中加入了多个小的全连接网络&#xff0c;用于对特征进行非…...

【Java笔记】泛型

本章专题与脉络 泛型概述 生活中的例子 举例1&#xff1a;中药店&#xff0c;每个抽屉外面贴着标签 举例2&#xff1a;超市购物架上很多瓶子&#xff0c;每个瓶子装的是什么&#xff0c;有标签 举例3&#xff1a;家庭厨房中&#xff1a; Java中的泛型&#xff0c;就类似于上…...

【Linux】用户管理

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享C/C相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…...

深入理解Mysql索引底层数据结构与算法

索引是帮助MySQL高效获取数据的排好序的数据结构 深入理解Mysql索引底层数据结构与算法1.常见的数据结构讲解1.1 二叉树1.1.1 二叉树的定义1.1.2 二叉树示例1.1.3 Mysql为什么不使用二叉树进行数据存储1.2 红黑树1.2.1 红黑树的定义1.2.2 红黑树示例1.2.3 Mysql 为什么不适用红…...

想给公司做个网站/网站设计培训

本文内容&#xff1a;1.僵尸进程&#xff0c;孤儿进程的定义&#xff0c;区别&#xff0c;产生原因&#xff0c;处理方法2.wait函数&#xff0c;waitpid函数的分析&#xff0c;以及比较背景&#xff1a;由于子进程的结束和父进程的运行是一个异步的过程&#xff0c;即父进程永远…...

关于加强内网网站建设的通知/游戏优化大师

user.class.php <?php/*一个功能&#xff0c;可以分解成很多小的功能&#xff0c;可以一直细分下去&#xff0c;只到没有过分重复的代码。重构&#xff0c;就是把一个小的功能&#xff0c;&#xff0c;拎出来&#xff0c;形成一个独立的服务。 这个函数虽然只有两行&#x…...

单位做网站注意什么/发表文章的平台有哪些

三面大概九十分钟&#xff0c;问的东西很全面&#xff0c;需要做充足准备&#xff0c;就是除了概念以外问的有点懵逼了&#xff08;呜呜呜&#xff09;。回来之后把这些题目做了一个分类并整理出答案&#xff08;强迫症的我狂补知识&#xff09;分为软件测试基础、Python自动化…...

做网站建本地环境作用/seo网站推广的主要目的包括

前面说完了此项目的创建及数据模型设计的过程。如果未看过&#xff0c;可以到这里查看&#xff0c;并且项目源码已经放大到github上,可以去这里下载。代码也已经部署到sina sea上&#xff0c;地址为http://fengzheng.sinaapp.com/先跳过视图展示及表单处理的部分&#xff0c;先…...

辽宁做网站/百度推广怎么注册账号

滚动条的组成&#xff1a; ::-webkit-scrollbar //滚动条整体部分 ::-webkit-scrollbar-thumb // 滚动条里面的小方块&#xff0c;能上下左右移动&#xff08;取决于是垂直滚动条还是水平滚动条&#xff09; ::-webkit-scrollbar-track //滚动条的轨道…...

南宁市保障住房建设管理服务中心网站/360站长工具seo

1 异常 异常&#xff1a;Java代码在运行时期发生的问题就是异常。 1.1 异常的继承体系 Throwable&#xff1a;是所有错误和异常的超类。 Error&#xff1a;错误类。 Exception&#xff1a;编译期异常&#xff0c;进行编译Java程序时出现的问题。 RuntimeException&#xf…...