频率阈图像滤波

介绍

        频率阈图像滤波是一种在频域中进行图像处理的方法,它基于图像的频率分布来实现滤波效果。具体步骤如下:

  1. 将原始图像转换到频域:使用快速傅里叶变换(FFT)将图像从空间域转换到频域。
  2. 对频域图像应用频率阈滤波器:根据要实现的滤波效果,设计一个频率阈滤波器。该滤波器可以是低通滤波器、高通滤波器或带通滤波器。
  3. 将频率阈滤波器应用于频域图像:将设计好的频率阈滤波器应用于频域图像,通过乘法操作将频域图像与滤波器进行卷积。
  4. 将滤波后的频域图像转换回空域:使用快速傅里叶逆变换(IFFT)将滤波后的频域图像转换回空域。
  5. 可选:对输出图像进行后处理:根据需要,可以对输出图像进行一些后处理操作,如归一化、增强对比度等。

        通过频率阈图像滤波,可以实现一些常见的图像处理任务,如去噪、边缘检测、图像锐化等。但是需要注意,频率阈图像滤波对于图像中的高频细节信息可能会有损失,因此在选择滤波器和阈值时需要平衡图像的细节保留和滤波效果。

代码

# -*- coding: utf-8 -*-
import sys
import numpy as np
import cv2
#截止频率
radius = 50
MAX_RADIUS = 100
#低通滤波类型
lpType = 0
MAX_LPTYPE = 2
#快速傅里叶变换
def fft2Image(src):#得到行、列r,c = src.shape[:2]#得到快速傅里叶变换最优rPadded = cv2.getOptimalDFTSize(r)cPadded = cv2.getOptimalDFTSize(c)#边缘扩充,下边缘和右边缘扩充值为零fft2 = np.zeros((rPadded,cPadded,2),np.float32)fft2[:r,:c,0]=src#快速傅里叶变换cv2.dft(fft2,fft2,cv2.DFT_COMPLEX_OUTPUT)return fft2#傅里叶幅度谱
def amplitudeSpectrum(fft2):#求幅度real2 = np.power(fft2[:,:,0],2.0)Imag2 = np.power(fft2[:,:,1],2.0)amplitude = np.sqrt(real2+Imag2)return amplitude
#幅度谱的灰度级显示
def graySpectrum(amplitude):#对比度拉伸#cv2.log(amplitude+1.0,amplitude)amplitude = np.log(amplitude+1.0)#归一化,傅里叶谱的灰度级显示spectrum = np.zeros(amplitude.shape,np.float32)cv2.normalize(amplitude,spectrum,0,1,cv2.NORM_MINMAX)return spectrum
#构建低通滤波器    
def createLPFilter(shape,center,radius,lpType=0,n=2):#滤波器的高和宽rows,cols = shape[:2]r,c = np.mgrid[0:rows:1,0:cols:1]c-=center[0]r-=center[1]d = np.power(c,2.0)+np.power(r,2.0)#构造低通滤波器lpFilter = np.zeros(shape,np.float32)if(radius<=0):return lpFilterif(lpType == 0):#理想低通滤波lpFilter = np.copy(d)lpFilter[lpFilter<pow(radius,2.0)]=1lpFilter[lpFilter>=pow(radius,2.0)]=0elif(lpType == 1): #巴特沃斯低通滤波lpFilter = 1.0/(1.0+np.power(np.sqrt(d)/radius,2*n))elif(lpType == 2): #高斯低通滤波lpFilter = np.exp(-d/(2.0*pow(radius,2.0)))return lpFilter
#主函数
if __name__ =="__main__":if len(sys.argv) > 1:#第一步:读入图像#image = cv2.imread(sys.argv[1],cv2.CV_LOAD_IMAGE_GRAYSCALE)image = cv2.imread(sys.argv[1],cv2.IMREAD_GRAYSCALE)else:print ("Usge:python LPFilter.py imageFile")#显示原图cv2.imshow("image",image)#第二步:每一元素乘以 (-1)^(r+c)fimage = np.zeros(image.shape,np.float32)for r in range(image.shape[0]):for c in range(image.shape[1]):if (r+c)%2:fimage[r][c] = -1*image[r][c]else:fimage[r][c] = image[r][c]#第三和四步:补零和快速傅里叶变换fImagefft2 = fft2Image(fimage)#傅里叶谱amplitude = amplitudeSpectrum(fImagefft2)#傅里叶谱的灰度级显示spectrum = graySpectrum(amplitude)cv2.imshow("originalSpectrum",spectrum)#找到傅里叶谱最大值的位置minValue,maxValue,minLoc,maxLoc = cv2.minMaxLoc(amplitude)#低通傅里叶谱灰度级的显示窗口cv2.namedWindow("lpFilterSpectrum",1)def nothing(*arg):pass#调节低通滤波类型cv2.createTrackbar("lpType","lpFilterSpectrum",lpType,MAX_LPTYPE,nothing)#调节截断频率cv2.createTrackbar("radius","lpFilterSpectrum",radius,MAX_RADIUS,nothing)#低通滤波结果result = np.zeros(spectrum.shape,np.float32)while True:#得到当前的截断频率、低通滤波类型radius = cv2.getTrackbarPos("radius","lpFilterSpectrum")lpType = cv2.getTrackbarPos("lpType","lpFilterSpectrum")#第五步:构建低通滤波器lpFilter = createLPFilter(spectrum.shape,maxLoc,radius,lpType)#第六步:低通滤波器和快速傅里叶变换对应位置相乘(点乘)rows,cols = spectrum.shape[:2]fImagefft2_lpFilter = np.zeros(fImagefft2.shape,fImagefft2.dtype)for i in range(2):fImagefft2_lpFilter[:rows,:cols,i] = fImagefft2[:rows,:cols,i]*lpFilter#低通傅里叶变换的傅里叶谱lp_amplitude = amplitudeSpectrum(fImagefft2_lpFilter)#显示低通滤波后的傅里叶谱的灰度级lp_spectrum = graySpectrum(lp_amplitude)cv2.imshow("lpFilterSpectrum", lp_spectrum)#第七和八步:对低通傅里叶变换执行傅里叶逆变换,并只取实部cv2.dft(fImagefft2_lpFilter,result,cv2.DFT_REAL_OUTPUT+cv2.DFT_INVERSE+cv2.DFT_SCALE)#第九步:乘以(-1)^(r+c)for r in range(rows):for c in range(cols):if (r+c)%2:result[r][c]*=-1#第十步:数据类型转换,并进行灰度级显示,截取左上角,大小和输入图像相等for r in range(rows):for c in range(cols):if result[r][c] < 0:result[r][c] = 0elif result[r][c] > 255:result[r][c] = 255lpResult = result.astype(np.uint8)lpResult = lpResult[:image.shape[0],:image.shape[1]]cv2.imshow("LPFilter",lpResult)             '''ch = cv2.waitKey(5)if ch == 27:break'''cv2.waitKey(0)cv2.destroyAllWindows()

运行方式

  1. 切换到项目代码所在路径
  2. 将要测试的图片放在代码的同级目录下
  3. 执行 python LPFilter.py orange.png  命令即可

效果 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/612107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS3背景样式详解(图像大小,图像位置等)

背景样式 在CSS3中&#xff0c;新增了3个背景属性 属性说明background-size背景大小background-origin背景位置background-clip背景剪切 background-size属性 概念&#xff1a;在CSS3之前&#xff0c;我们是不能用CSS来控制背景图片大小的&#xff0c;背景图片的大小都是由…

深入理解 Flink(三)Flink 内核基础设施源码级原理详解

Hadoop 生态各大常见组件的 RPC 技术实现 Flink RPC 网络通信框架 Akka 详解 1、ActorSystem 是管理 Actor 生命周期的组件&#xff0c;Actor 是负责进行通信的组件。 2、每个 Actor 都有一个 MailBox&#xff0c;别的 Actor 发送给它的消息都首先储存在 MailBox 中&#xff0c…

Tomcat-快速使用

关于Tomcat的概念及来由在Tomcat基本知识中进行了介绍&#xff0c;下面我们直接上手快速使用起来。 一、快速使用 &#xff08;1&#xff09;tomcat下载 &#xff08;2&#xff09;解压缩 &#xff08;3&#xff09;启动程序 &#xff08;4&#xff09;访问tomcat&#xff1a…

Serverless 开拓无服务器时代:云计算的新趋势(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

精华整理几十个Python数据科学、机器学习、深度学习、神经网络、人工智能方面的核心库以及详细使用实战案例,轻松几行代码训练自己的专有人工智能模型

精华整理几十个Python数据科学、机器学习、深度学习、神经网络、人工智能方面的核心库以及详细使用实战案例,轻松几行代码训练自己的专有人工智能模型。 机器学习 人工智能的核心,是使计算机具有智能的根本途径。机器学习专注于算法,允许机器学习而不需要编程,并在暴露于新…

OpenHarmony之编译构建使用指导

目录结构 /build # 编译构建主目录├── __pycache__ ├── build_scripts/ # 编译相关的python脚本 ├── common/ ├── config/ # 编译相关的配置项 ├─…

FlinkAPI开发之窗口(Window)

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 窗口的概念 Flink是一种流式计算引擎&#xff0c;主要是来处理无界数据流的&#xff0c;数据源源不断、无穷无尽。…

10个提高 Python Web 开发效率的VS Code插件

VS Code具有灵活、便捷和丰富的可用插件库&#xff0c;是Web开发人员中非常受欢迎的代码编辑器。 本文介绍10个VS Code插件&#xff0c;它们可以提高你作为Web开发人员的工作效率。 1. Live Preview Live Preview插件支持在VS Code的小型浏览器中查看网站。因此&#xff0c;无…

办公场景日益多样化 企业如何保持安全?

当前&#xff0c;企业的办公场景日益多样化。远程办公、移动办公、云办公、分支机构等&#xff0c;这些新的办公场景也带来了新的网络安全挑战。以下将介绍一些办公场景带来的安全威胁。 1、远程办公&#xff1a;员工可以在任何地方工作&#xff0c;但同时也带来了网络安全的隐…

C++游戏引擎中的坐标系

一.Direct3D四大变换 <1.世界矩阵变换: 为了模拟3D物体的旋转,缩放,平移等功能,Direct3D将静态模型的顶点坐标x,y,z经过旋转平移矩阵变换以得到新的顶点坐标x1,y1,z1 D3DXMATRIX mTrans ; D3DXMatrixTranslation (&mTrans , 5 , - 3 , 0 ); g_pd3dDevice->SetTr…

引领行业赛道!聚铭网络入选安全419年度策划“2023年教育行业优秀解决方案”

近日&#xff0c;由网络安全产业资讯媒体安全419主办的《年度策划》2023年度优秀解决方案评选结果正式出炉&#xff0c;聚铭网络「高校大日志留存分析及实名审计解决方案」从众多参选方案中脱颖而出&#xff0c;被评为“教育行业优秀解决方案”&#xff0c;以硬核实力引领行业赛…

java基础 -02java集合之 List,AbstractList,ArrayList介绍

补充上篇 AbstractCollection < E > 在正式List之前&#xff0c;我们先了解我们补充上篇Collection接口的拓展实现&#xff0c;也就是说当我我们需要实现一个不可修改的Collection的时候&#xff0c;我们只需要拓展某个类&#xff0c;也就是AbstractCollection这个类&a…

ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

安全漏洞周报(2024.01.01-2023.01.08)

漏洞速览 ■ 用友CRM系统存在逻辑漏洞 漏洞详情 1. 用友CRM系统存在逻辑漏洞 漏洞介绍&#xff1a; 某友CRM系统是一款综合性的客户关系管理软件&#xff0c;旨在帮助企业建立和维护与客户之间的良好关系。它提供了全面的功能&#xff0c;包括销售管理、市场营销、客户服…

1.10 Unity中的数据存储 XML

一、XML 1.介绍 XML是一个文档后缀名是*.xmlXML是一个特殊格式的文档XML是可扩展的标记性语言XML是Extentsible Markup Language的缩 写XML是由万维网联盟(W3C)创建的标记语言&#xff0c;用于定义编码人类和机器可以读取的文档的语法。它通过使用定义文档结构的标签以及如何…

代码随想录算法训练营第二十一天| 回溯 216. 组合总和 III 17. 电话号码的字母组合

216. 组合总和 III 可以参考77.组合中关于选取数组的相关操作。 递归函数的返回值以及参数&#xff1a;一般为void类型 递归函数终止条件&#xff1a;path这个数组的大小如果达到k&#xff0c;说明我们找到了一个子集大小为k的组合了&#xff0c;然后当n为0的时候&#xff0…

Maven报错:Malformed \uxxxx encoding 解决办法

maven构建出现这个Malformed \uxxxx encoding问题&#xff0c;应该是maven仓库里面有脏东西进入了&#xff01; 解决&#xff1a; 将仓库中的resolver-status.properties文件全部干掉。 我使用的everything工具全局搜索resolver-status.properties文件&#xff0c;然后Ctrla,再…

Nodejs 第三十一章(响应头和请求头)

响应头 HTTP响应头&#xff08;HTTP response headers&#xff09;是在HTTP响应中发送的元数据信息&#xff0c;用于描述响应的特性、内容和行为。它们以键值对的形式出现&#xff0c;每个键值对由一个标头字段&#xff08;header field&#xff09;和一个相应的值组成。 例如…

第三十九级台阶

解题思路&#xff1a; 本题运用递归的思想&#xff0c;每走一步可以上一个或者两个台阶&#xff0c;一开始是左脚最后是右脚&#xff0c;所以走的总步数应该为偶数&#xff0c;最后跨过的台阶数应该等于39。 解题代码&#xff1a; public class disnashijiujitaijie {static i…

03. BI - 详解机器学习神器 XGBoost

本文专辑 : 茶桁的AI秘籍 - BI篇 原文链接: https://mp.weixin.qq.com/s/kLEg_VcxAACy8dH35kK3zg 文章目录 集成学习XGBoost Hi&#xff0c;你好。我是茶桁。 学习总是一个循序渐进的过程&#xff0c;之前两节课的内容中&#xff0c;咱们去了解了LR和SVM在实际项目中是如何使…