频率阈图像滤波

介绍

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

  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.hqwc.cn/news/338949.html

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

相关文章

“当实力撑不起野心的时候,学习才是唯一的出路”(2023回顾与展望)

“当实力撑不起野心的时候&#xff0c;学习才是唯一的出路”&#xff0c;窃以此言铭已&#xff0c;以激励学习路上不懈怠。这是我今年最庆幸的事&#xff1a;窃得一条铭言&#x1f4aa; (笔记模板由python脚本于2024年01月07日 13:57:54创建&#xff0c;本篇笔记适合尝试学习编…

Python-代码雨【附源码】

Python-代码雨 运行效果&#xff1a;实现的是动态的代码雨 import sys import random import pygame from pygame.locals import *# 屏幕大小 WIDTH 800 HEIGHT 600 # 下落速度范围 SPEED [15, 30] # 字母大小范围 SIZE [5, 30] # CODE长度范围 LEN [1, 8]# 随机生成一个…

Windows启动MongoDB服务报错(错误 1053:服务没有及时响应启动或控制请求)

问题描述&#xff1a;修改MongoDB服务bin目录下的mongod.cfg&#xff0c;然后在任务管理器找到MongoDB服务-->右键-->点击【开始】&#xff0c;启动失败无提示&#xff1a; 右键点击任务管理器的MongoDB服务-->点击【打开服务】&#xff0c;跳转到服务页面-->找到M…

TypeScript进阶(二)深入理解装饰器

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…

第20集《佛法修学概要》

戊二、述义&#xff08;三&#xff09; 请大家打开讲义第五十一页&#xff0c;我们讲到实相的义理第三段。 &#xff08;三&#xff09;若人欲了知&#xff0c;三世一切佛&#xff0c;应观法界性&#xff0c;一切唯心造。 ——《华严经》—— 佛陀出世以后&#xff0c;看到…

C语言九九乘法表打印最全!

九九乘法表共 9 行 9 列&#xff0c;重点考察 for 循环的掌握情况。 适合刚学习C语言的同学来练习! 输出完整的三角形&#xff1a; 运行结果&#xff1a; 1*1 1 1*2 2 1*3 3 1*4 4 1*5 5 1*6 6 1*7 7 1*8 8 1*9 9 2*1 2 2*2 4 2*3 6 2*4 8 2*510 2*612 2*714…

了解结构体以及结构体数组

C语言的结构体你真的了解吗&#xff1f; 一起来看一下吧&#xff01;&#xff01;&#xff01; 1.结构体是啥&#xff1f; 结构体是多种数据类型的组合体 2.格式&#xff08;一般放在主函数前&#xff0c;也就是int main()前面 &#xff09; 关键字 结构体名字 {成员列表…

Linux 文件(夹)权限查看

命令 : ls -al ls -al 是一个用于列出指定目录下所有文件和子目录的命令,包括隐藏文件和详细信息。其中,-a 选项表示显示所有文件,包括以 . 开头的隐藏文件,-l 选项表示以列表的形式显示文件的详细信息。 本例中:drwxrwxr-x 为权限细节。 权限细节(Permission detail…

rke2 Online Deploy Rancher v2.8.0 latest (helm 在线部署 rancher v2.8.0)

文章目录 1. 简介2. 预备条件3. 安装 helm4. 安装 cert-manager4.1 yaml 安装4.2 helm 安装 5. 安装 rancher6. 验证7. 界面预览 1. 简介 Rancher 是一个 Kubernetes 管理工具&#xff0c;让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托…

1.10 Unity中的数据存储 XML

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

陶瓷碗口圆度检测案例-圆心定位与圆度检测

检测原理 从陶瓷外边界上面随机提取3个点&#xff0c;并以其行列位置为横纵坐标构造三对坐标点。利用此三点可确定三角形外心。公式计算如下&#xff1a; x0和y0为圆心的位置坐标&#xff0c;为标准圆的半径。 在实际中&#xff0c;存在以下两种情况会导致上述算法无法准确计…

MySQL 从零开始:02 MySQL 安装

文章目录 1、下载 MySQL 安装程序2、安装 MySQL 要操作 MySQL &#xff0c;首先要安装 MySQL &#xff0c;本文将一步步展示如何安装 MySQL&#xff0c;简直详细到令人发指。 环境&#xff1a; 操作系统&#xff1a;Windows10 64位MySQL版本&#xff1a;社区版 8.0.11.0 1、下…