频率阈图像滤波

news2025/1/9 0:41:30

介绍

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

  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 lpFilter
    if(lpType == 0):#理想低通滤波
        lpFilter = np.copy(d)
        lpFilter[lpFilter<pow(radius,2.0)]=1
        lpFilter[lpFilter>=pow(radius,2.0)]=0
    elif(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] = 0
                elif result[r][c] > 255:
                    result[r][c] = 255
        lpResult = 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.coloradmin.cn/o/1373769.html

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

相关文章

Tensorflow Lite从入门到精通

TensorFlow Lite 是 TensorFlow 在移动和 IoT 等边缘设备端的解决方案&#xff0c;提供了 Java、Python 和 C API 库&#xff0c;可以运行在 Android、iOS 和 Raspberry Pi 等设备上。目前 TFLite 只提供了推理功能&#xff0c;在服务器端进行训练后&#xff0c;经过如下简单处…

斯坦福Mobile ALOHA提到的ACT之外的另两项技术:Diffusion Policy、VINN

前言 本文接上一篇文章《斯坦福机器人Mobile ALOHA的关键技术&#xff1a;动作分块ACT的算法原理与代码剖析》而来&#xff0c;当然最开始本文是作为上一篇文章的第二、第三部分的 但因为ACT太过关键&#xff0c;除了在上一篇文章中写清楚其算法原理之外&#xff0c;还得再剖…

Java研学-三层架构实现简单登录操作

一 登录流程 将服务器资源给有权限的人访问&#xff0c;只有登录的管理员可以访问员工信息进行 CRUD 二 三层架构 Web 开发中的最佳实践&#xff1a;分层开发模式将整个业务应用划分为&#xff1a;表现层、业务逻辑层、数据访问层。区分层次的目的即为了“高内聚低耦合”的思想…

2023启示录 | 商业航天这一年

图片&#xff5c;SpaceX ©⾃象限原创 作者丨罗辑 编辑丨程心 整个2023年&#xff0c;在全球热度上能够和ChatGPT一争高下的&#xff0c;可能只有SpaceX的两次星舰发射。 就像2023年菜市场卖鱼的大爷都能聊两句大模型一样&#xff0c;即使从来不关心航天的人也会知道星舰…

话题浏览暴涨558%!从DIY到爆改,小红书数据洞察用户关注焦点

最近走红的“爆改”你们听说了吗&#xff1f;各大社媒平台明星爆改、素人爆改&#xff0c;频上热门。改造风流行的小红书&#xff0c;热度更盛&#xff0c;从DIY到爆改&#xff0c;用户关注焦点是什么&#xff1f;博主和品牌如何讲述“改造”&#xff1f;通过数据分析&#xff…

transbigdata笔记:数据预处理

0 数据 使用 transbigdata/docs/source/gallery/data/TaxiData-Sample.csv at main ni1o1/transbigdata (github.com) 和transbigdata/docs/source/gallery/data/sz.json at main ni1o1/transbigdata (github.com) 0.1 导入库 import transbigdata as tbd import pandas …

Hello,World!

“Hello, world”的由来可以追溯到 The C Programming Language 。在这门编程语言中&#xff0c;它被用作第一个演示程序&#xff0c;向人们展示了在计算机屏幕上输出“Hello world”这行字符串的计算机程序。由于这个演示程序的简洁性和直观性&#xff0c;它成为了许多初学者学…

傅昌林:百万级数据挑战的大师,NineData编程大赛的卓越表现

数据库编程大赛&#xff1a;一条SQL计算扑克牌24点 参赛选手&#xff1a;傅昌林 个人简介&#xff1a;HBI Solutions, Inc, VP Engineering 参赛数据库&#xff1a;SQL Server 性能评测&#xff1a;百万级数据代码性能评测 11.45秒 综合得分&#xff1a;78.8 以下是傅昌林…

golang学习-指针

1、定义 指针也是一个变量&#xff0c;但它是一个特殊的变量&#xff0c;它存储的是另一个变量的内存地址。是引用数据类型。 取一个变量的地址&#xff1a;&a 定义&#xff1a; var p *int &a 可以理解为 指针变量p中存储的是a的内存地址&#xff0c;但是变量p也…

vue实现-年、月、日、时、分、秒、星期?

一、文章引导 #mermaid-svg-nP4oT3Y4d6oaxUsg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nP4oT3Y4d6oaxUsg .error-icon{fill:#552222;}#mermaid-svg-nP4oT3Y4d6oaxUsg .error-text{fill:#552222;stroke:#55222…

安卓应用无法拉起部分机型微信支付

错误提示&#xff1a; 2024-01-11 09:01:01.878 11754-11754 MicroMsg.S...ApiImplV10 com.bm.read E register app failed for wechat app signature check failed 2024-01-11 09:01:01.879 11754-11754 MicroMsg.S...ApiImplV10 com.bm.read E s…

蔚来出手,空气悬架「悬」了

空气悬架的这把火&#xff0c;可能要被「浇灭」了。 目前&#xff0c;在乘用车赛道&#xff0c;主动悬架按照控制类型&#xff0c;主要可以分为液压悬架、空气悬架和电磁感应悬架。其中&#xff0c;空气悬架因为中国本土造车新势力的强力推动&#xff0c;在过去几年时间成为市场…

C++11教程:C++11新特性大汇总(第六部分)

C11是2011年发布的C标准&#xff0c;是C的一次重大升级。 第十二部分&#xff1a;C多文件编程 十一、C11列表初始化&#xff08;统一了初始化方式&#xff09; 我们知道&#xff0c;在 C98/03 中的对象初始化方法有很多种&#xff0c;请看下面的代码&#xff1a; //初始化列…

SpringBoot+SSM项目实战 苍穹外卖(10) Spring Task WebSocket

继续上一节的内容&#xff0c;本节学习Spring Task和WebSocket&#xff0c;并完成订单状态定时处理、来单提醒和客户催单功能。 目录 Spring Task&#xff08;cron表达式&#xff09;入门案例 订单状态定时处理WebSocket入门案例 来单提醒客户催单 Spring Task&#xff08;cron…

⭐Unity 将电脑打开的窗口画面显示在程序中

1.效果&#xff1a; 下载资源包地址&#xff1a; Unity中获取桌面窗口 2.下载uWindowCapturev1.1.2.unitypackage 放入Unity工程 3.打开Single Window场景&#xff0c;将组件UwcWindowTexture的PartialWindowTitle进行修改&#xff0c;我以腾讯会议为例 感谢大家的观看&#xf…

python爬虫实战(7)--获取it某家热榜

1. 需要的类库 import requests from bs4 import BeautifulSoup import pandas as pd2. 请求榜单 def fetch_ranking_data():url "https://m.xxx.com/rankm/" #某家response requests.get(url)if response.status_code 200:return response.contentelse:print(f…

AIGC实战——改进循环神经网络

AIGC实战——改进循环神经网络 0. 前言1. 堆叠循环网络2. 门控制循环单元3. 双向单元相关链接 0. 前言 我们已经学习了如何训练长短期记忆网络 (Long Short-Term Memory Network, LSTM) 模型&#xff0c;以学习使用给定风格生成文本&#xff0c;接下来&#xff0c;我们将学习如…

vue 登陆禁止弹出保存密码框及禁止默认填充密码

οnfοcus“this.removeAttribute(‘readonly’);” readonly 初始化为只读&#xff0c;当聚焦时去掉只读属性&#xff0c;只读可以防止浏览器自动填充。 -webkit-text-security&#xff1a;指定要使用的形状来代替文字的显示 none 无。 circle 圆圈。 disc 圆形。 square 正方…

【Python学习】Python学习12-字典

目录 【Python学习】Python学习12-字典 前言创建语法访问列表中的值修改与新增字典删除字典元素Python字典内置函数&方法参考 文章所属专区 Python学习 前言 本章节主要说明Python的字典&#xff0c;是可变的容器&#xff0c;每个字典由键值对组成用冒号隔开&#xff0c;…

ArcMap实现多行标注

地图标注是地图的重要组成部分&#xff0c;也是地理信息的重要表达方式​。ArcMap的符号化系统为我们添加地图标注提供了方便&#xff0c;但是有时我们却需要添加多行标注&#xff0c;今天我们一起来探索一下ArcMap中两行标注的实现方式​。 首先&#xff0c;我们右击目标图层…