数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波

news2024/12/23 14:12:46

目录

一 Numpy 实现傅里叶变换

1 涉及的函数

2 实践

二 OpenCV 实现傅里叶变换

1 涉及的函数

2 实践


         为了有效地和快速地对图像进行处理和分析,常常需要将原定义在图像空间的图像以某种形式转换(正变换)到另外一些空间,并利用在这些空间的特有性质方便地进行一定的加工,最后再转换回图像空间(反变换或逆变换)以得到所需要的效果。傅里叶变换就是把图像从图像空间变换到频率空间。

        对于一幅图像来说在分析其频率特性时,它的边缘,突变部分以及颗粒噪声往往代表图像信号的高频分量,而大面积的图像背景区则代表图像信号的低频分量。根据此特点使用滤波的方法滤除其高频部分也就能够去除噪声,使图像得到一定的平滑。

低通滤波器:只保留低频,会使得图像变得模糊。

高通滤波器:只保留高频,会使得图像细节增强。例如边界增强。

一 Numpy 实现傅里叶变换

1 涉及的函数
  • np.fft.fft2()

通过 numpy 实现傅里叶变换用到的函数是 np.fft.fft2():

fft.fft2(a, s=None, axes=(-2, -1), norm=None)

函数的功能:计算二维离散傅里叶变换。

输入

①a:输入数组.array_like

②s:可选。整数序列,输出数组的大小。

返回

complex ndarray。

通过 np.fft.fft2() 函数进行傅里叶变换得到频率分布,再调np.fft.fftshift 函数将中心位置转移至中间位置。

  • np.fft.ifft2()
np.fft.ifft2(a, s=None, axes=(-2, -1), norm=None)

函数的功能:实现图像逆傅里叶变换,返回一个复数数组。

输入

①a:输入数组.array_like

②s:可选。整数序列,输出数组的大小。

返回

complex ndarray。

以上只是对常用的参数进行介绍,其他的参数可以详见官方文档去学习哈。

2 实践

实践①:图像的傅里叶变换

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
    b, g, r = cv2.split(img)
    img_rgb = cv2.merge([r, g, b])
    return img_rgb
def dealImageResult(img_path):
    im = cv2.imread(img_path, 0)
    # 实现傅里叶变换
    f = np.fft.fft2(im)
    # 实现中心位置转移至中间位置
    fshift = np.fft.fftshift(f)
    # 将复数转为浮点数进行傅里叶频谱图显示
    fimg = 20 * np.log(np.abs(fshift))
    fig = plt.figure(figsize=(10, 10))
    titles = ["img", " result"]
    images = [im, fimg]
    for i in range(2):
        plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")
        plt.title("{}".format(titles[i]), fontsize=20, ha='center')
        plt.xticks([]), plt.yticks([])
    #plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
    # plt.tight_layout()
    plt.show()
    fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
    dealImageResult("1.png")
    pass
  • 结果图

实践②:图像的傅里叶变换与逆变换

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
    b, g, r = cv2.split(img)
    img_rgb = cv2.merge([r, g, b])
    return img_rgb
def dealImageResult(img_path):
    im = cv2.imread(img_path, 0)
    # 实现傅里叶变换
    f = np.fft.fft2(im)
    # 实现中心位置转移至中间位置
    fshift = np.fft.fftshift(f)
    # 将复数转为浮点数进行傅里叶频谱图显示
    fimg = 20 * np.log(np.abs(fshift))
    ifshift = np.fft.ifftshift(fshift)
    # 将复数转为浮点数进行傅里叶频谱图显示
    ifimg = np.log(np.abs(ifshift))
    if_img = np.fft.ifft2(ifshift)
    result_im = np.abs(if_img)
    fig = plt.figure(figsize=(10, 10))
    titles = ["im", " fimg", "ifimg", "result_im"]
    images = [im, fimg, ifimg, result_im]
    for i in range(4):
        plt.subplot(2, 2, i + 1), plt.imshow(images[i], "gray")
        plt.title("{}".format(titles[i]), fontsize=20, ha='center')
        plt.xticks([]), plt.yticks([])
    #plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
    # plt.tight_layout()
    plt.show()
    fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
    dealImageResult("1.png")
    pass
  • 结果图

实践③:低通滤波

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
    b, g, r = cv2.split(img)
    img_rgb = cv2.merge([r, g, b])
    return img_rgb
def dealImageResult(img_path):
    im = cv2.imread(img_path, 0)
    # 实现傅里叶变换
    f = np.fft.fft2(im)
    # 实现中心位置转移至中间位置
    fshift = np.fft.fftshift(f)
    rows, cols = im.shape
    crow, ccol = rows//2, cols//2
    # 掩模,大小和图像一样,np.zeros初始化
    mask = np.zeros((rows, cols), np.uint8)
    mask[crow-40:crow+40, ccol-40:ccol+40] = 1
    fshift = fshift * mask
    # 傅里叶逆变换
    ifshift = np.fft.ifftshift(fshift)
    ifimg = np.fft.ifft2(ifshift)
    result_im = np.abs(ifimg)
    fig = plt.figure(figsize=(10, 10))
    titles = ["im", "result_im"]
    images = [im, result_im]
    for i in range(2):
        plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")
        plt.title("{}".format(titles[i]), fontsize=20, ha='center')
        plt.xticks([]), plt.yticks([])
    #plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
    # plt.tight_layout()
    plt.show()
    fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
    dealImageResult("1.png")
    pass
  • 结果图

实践④:高通滤波

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
    b, g, r = cv2.split(img)
    img_rgb = cv2.merge([r, g, b])
    return img_rgb
def dealImageResult(img_path):
    im = cv2.imread(img_path, 0)
    # 实现傅里叶变换
    f = np.fft.fft2(im)
    # 实现中心位置转移至中间位置
    fshift = np.fft.fftshift(f)
    rows, cols = im.shape
    crow, ccol = rows//2, cols//2
    # 掩模
    mask = np.ones((rows, cols), np.uint8)
    mask[crow-40:crow+40, ccol-40:ccol+40] = 0
    fshift = fshift * mask
    # 傅里叶逆变换
    ifshift = np.fft.ifftshift(fshift)
    ifimg = np.fft.ifft2(ifshift)
    result_im = np.abs(ifimg)
    fig = plt.figure(figsize=(10, 10))
    titles = ["im", "result_im"]
    images = [im, result_im]
    for i in range(2):
        plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")
        plt.title("{}".format(titles[i]), fontsize=20, ha='center')
        plt.xticks([]), plt.yticks([])
    #plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
    # plt.tight_layout()
    plt.show()
    fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
    dealImageResult("1.png")
    pass
  • 结果图

二 OpenCV 实现傅里叶变换

        Opencv 中主要通过 cv2.dft() 和 cv2.idft()实现傅里叶变换逆变换

        在输入图像之前需要先把图像从 np.uint8转换为 np.float32格式; 傅里叶变换其得到的结果中,频率为0的部分会在左上角位置,通常需要通过 shift 变换转换到中心的位置。cv2.idft()返回的结果是双通道的(实部,虚部),还需要转换成图像格式才能够展示。

1 涉及的函数
dst = cv.dft(src[, dst[, flags[, nonzeroRows]]])

dst = cv2.idft(src[, dst[, flags[, nonzeroRows]]])
2 实践

实践①:图像的傅里叶变换

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
    b, g, r = cv2.split(img)
    img_rgb = cv2.merge([r, g, b])
    return img_rgb
def dealImageResult(img_path):
    im = cv2.imread(img_path, 0)
    # 实现傅里叶变换
    result = cv2.dft(np.float32(im), flags=cv2.DFT_COMPLEX_OUTPUT)
    # 实现中心位置转移至中间位置
    fshift = np.fft.fftshift(result)
    result_fft = 20 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1]))
    fig = plt.figure(figsize=(10, 10))
    titles = ["im", "result_fft"]
    images = [im, result_fft]
    for i in range(2):
        plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")
        plt.title("{}".format(titles[i]), fontsize=20, ha='center')
        plt.xticks([]), plt.yticks([])
    #plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
    # plt.tight_layout()
    plt.show()
    fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
    dealImageResult("5.jpg")
    pass

结果图

实践②:低通滤波

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
    b, g, r = cv2.split(img)
    img_rgb = cv2.merge([r, g, b])
    return img_rgb
def dealImageResult(img_path):
    im = cv2.imread(img_path, 0)
    # 实现傅里叶变换
    result = cv2.dft(np.float32(im), flags=cv2.DFT_COMPLEX_OUTPUT)
    # 实现中心位置转移至中间位置
    fshift = np.fft.fftshift(result)
    result_fft = 20 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1]))
    rows, cols = im.shape
    crow, ccol = rows//2, cols//2
    # 掩模
    mask = np.zeros((rows, cols, 2), np.uint8)
    mask[crow-40:crow+40, ccol-40:ccol+40] = 1
    fshift = fshift * mask
    # 傅里叶逆变换
    ifshift = np.fft.ifftshift(fshift)
    result_im = cv2.idft(ifshift)
    result_im = cv2.magnitude(result_im[:, :, 0], result_im[:, :, 1])
    fig = plt.figure(figsize=(10, 10))
    titles = ["im", "result_im"]
    images = [im, result_im]
    for i in range(2):
        plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")
        plt.title("{}".format(titles[i]), fontsize=20, ha='center')
        plt.xticks([]), plt.yticks([])
    #plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
    # plt.tight_layout()
    plt.show()
    fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
    dealImageResult("5.jpg")
    pass
  • 结果图

实践③:高通滤波

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
def dealImg(img):
    b, g, r = cv2.split(img)
    img_rgb = cv2.merge([r, g, b])
    return img_rgb
def dealImageResult(img_path):
    im = cv2.imread(img_path, 0)
    # 实现傅里叶变换
    result = cv2.dft(np.float32(im), flags=cv2.DFT_COMPLEX_OUTPUT)
    # 实现中心位置转移至中间位置
    fshift = np.fft.fftshift(result)
    result_fft = 20 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1]))
    rows, cols = im.shape
    crow, ccol = rows//2, cols//2
    # 掩模
    mask = np.ones((rows, cols, 2), np.uint8)
    mask[crow-40:crow+40, ccol-40:ccol+40] = 0
    fshift = fshift * mask
    # 傅里叶逆变换
    ifshift = np.fft.ifftshift(fshift)
    result_im = cv2.idft(ifshift)
    result_im = cv2.magnitude(result_im[:, :, 0], result_im[:, :, 1])
    fig = plt.figure(figsize=(10, 10))
    titles = ["im", "result_im"]
    images = [im, result_im]
    for i in range(2):
        plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")
        plt.title("{}".format(titles[i]), fontsize=20, ha='center')
        plt.xticks([]), plt.yticks([])
    #plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
    # plt.tight_layout()
    plt.show()
    fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
    dealImageResult("5.jpg")
    pass
  • 结果图

前文回顾

入门篇目录

 数字图像处理(入门篇)一 图像的数字化与表示

 数字图像处理(入门篇)二 颜色空间

 数字图像处理(入门篇)三 灰度化

 数字图像处理(入门篇)四 像素关系

 数字图像处理(入门篇)五 图像数据预处理之颜色空间转换

 数字图像处理(入门篇)六 图像数据预处理之坐标变化

 数字图像处理(入门篇)七 图像数据预处理之灰度变化

 数字图像处理(入门篇)八 图像数据预处理之直方图

 数字图像处理(入门篇)九 图像数据预处理之滤波

 数字图像处理(入门篇)十 边缘检测

 数字图像处理(入门篇)十一 形态学处理

 数字图像处理(入门篇)十二 自适应阈值分割

 数字图像处理(入门篇)十三 仿射变换

 数字图像处理(入门篇)十四 透视变换

 实践篇目录

数字图像处理(实践篇)一 将图像中的指定目标用bBox框起来吧!

数字图像处理(实践篇)二 画出图像中目标的轮廓

数字图像处理(实践篇)三 将两张图像按照指定比例融合

数字图像处理(实践篇)四 图像拼接-基于SIFT特征点和RANSAC方法

数字图像处理(实践篇)五 使用Grabcut算法进行物体分割

数字图像处理(实践篇)六 利用hough变换进行直线检测

数字图像处理(实践篇)七 利用霍夫变换进行圆环检测

数字图像处理(实践篇)八 Harris角点检测

数字图像处理(实践篇)九 基于边缘的模板匹配

数字图像处理(实践篇)十 图像质量检测

数字图像处理(实践篇)十一 图像中的条形码解析

数字图像处理(实践篇)十二 基于小波变换的图像降噪

数字图像处理(实践篇)十三 数据增强之给图像添加噪声!

数字图像处理(实践篇)十四 图像金字塔

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

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

相关文章

测试与管理 Quota

用myquota1创建一个大的文件测试 理论猜想:超过soft可以,但是超过hard就不行了,最大值就是hard,如果超过soft,过了17天不处理,最后限制值会被强制设置成soft。修改设置成hard值 切换测试用户,m…

阿里云国际短信业务网络超时排障指南

选取一台或多台线上的应用服务器或选取相同网络环境下的机器,执行以下操作。 获取公网出口IP。 curl ifconfig.me 测试连通性。 (推荐)执行MTR命令(可能需要sudo权限),检测连通性,执行30秒。 m…

对数据页的理解

1.InnoDB 是如何存储数据的? 数据表中的记录是按照行来存储的,但是数据库的读取并不以「行」为单位,否则一次读取(也就是一次 I/O 操作)只能处理一行数据,效率会非常低。 因此,InnoDB 的数据是按…

Git——工作区管理

如何管理工作目录,以便用户可以更高效地新建提交。如何在处理工作区和暂存区文件的过程中修复错误,以及如何修复最近一次提交记录中的问题;同时还会了解到如何安全地使用暂存机制和多个工作目录处理工作流中的中断问题。 主要内容有以下几点…

黑马微信小程序学习笔记

小程序和普通网页的区别 1、运行环境不同 网页运行在浏览器环境中 小程序运行在微信环境中 2、API不同 由于运行环境的不同,在小程序中无法调用DOM和BOM 的API(因为这两个API是浏览器暴露出来的,微信环境没有) 但是可以调用微信提…

华清远见嵌入式学习——C++——作业3

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;class Per { private:string name;int age;double *high;double *weight; public://有参构造函数Per(string n,int a,double h,double w):name(n),age(a),high(new double(h)),weight(ne…

统信UOS和vue.js的一个兼容问题

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 这事到现在说起还很奇怪&#xff0c;在UOS20&#xff08;硬件为华为鲲鹏服务器&#xff0c;arm架构&#xff0c;g8.3&#xff09;上部署uve.js&#xff0…

利润大增,MAU膝斩,谋求转型的新氧头顶“荆棘王冠”

撰稿|行星 来源|贝多财经 近日&#xff0c;医疗美容服务平台新氧科技&#xff08;NASDAQ:SY&#xff0c;下称“新氧”&#xff09;发布了2023年第三季度未经审计的财务业绩报告。 财报显示&#xff0c;新氧于2023年第三季度实现收入3.85亿元&#xff0c;同比增长19.2%&#x…

SS8844T四通道 1/2 H 桥驱动芯片发,替代A4979,DRV8844,L6288,MP6527

SS8844T 提供四个可独立控制的 1/2 H 桥启 动器。 它可被用于驱动两个 DC 电机、一个步进 电机、四个螺线管或者其它负载。 针对每个通道 的输出驱动器通道由在一个 1/2 H 桥配置中进行配 置的 N 通道功率 MOSFET 组成。 SS8844T 在每个桥的通道上提供高达 2.5A 峰…

继承中的析构函数的权限的深入了解

如果一个父类中的析构函数如果设置为 private 权限 &#xff0c;一个子类public继承了这个父类&#xff0c;那么 这个父类可以创建对象吗&#xff1f; 答案是 不可以 看看下面的代码 class A { public:private:~A() {} };class B :public A {A a; // 这个地方编译不报错&…

零基础搭建本地Nextcloud私有云结合内网穿透实现远程访问

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;摘要一. 环境搭建二. 测试局域网访问三. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建…

JavaScript WebApi 一(详讲)

基础知识在前面的部分已经讲过了&#xff0c;大家如果没有学习过JavaScript的可以去看一下 1.DOM 引入 在JavaScript中&#xff0c;DOM&#xff08;文档对象模型&#xff09;提供了一种表示和操作HTML文档的方式。在DOM中&#xff0c;文档被表示为一个由节点组成的树形结构。…

IC修真院 | 芯片嵌入式课程重磅上线!

万物互联的时代&#xff0c;离不开嵌入式。 从传统的家用电器到工业控制&#xff0c;从汽车电子到医疗保健&#xff0c;从军事应用到物联网&#xff0c;嵌入式系统无处不在。 我们的后台也经常能收到大家关于“嵌入式”的咨询&#xff0c;也了解到了大家对于嵌入式课程的迫切…

探索前端设计的新境界——介绍IVueUI工具助力Vue页面设计

在快速发展的前端领域&#xff0c;Vue.js作为一款渐进式JavaScript框架&#xff0c;一直备受开发者喜爱。然而&#xff0c;在Vue前端开发的旅程中&#xff0c;页面设计常常是一个不可避免的挑战。今天&#xff0c;我要向大家介绍一款令Vue前端开发者受益匪浅的工具——www.ivue…

selenium+python

selenium 八大查找元素 from selenium import webdriver from selenium.webdriver.common.by import By# 创建一个 WebDriver 实例 driver webdriver.Chrome()# 打开网页 driver.get("https://www.baidu.com/")# 使用 find_element 方法查找元素 element driver.…

【UE】透视效果

效果 步骤 1. 新建一个空白工程 2. 添加一个第三人称游戏和初学者内容包到内容浏览器 3. 新建一个材质&#xff0c;这里命名为“M_Perspective” 打开“M_Perspective”&#xff0c;设置材质域为后期处理 添加三个“SceneTexture”节点&#xff0c;场景纹理ID选项分别设置为“…

如何绕过某讯手游保护系统并从内存中获取Unity3D引擎的Dll文件

某讯的手游保护系统用的都是一套&#xff0c;在其官宣的手游加固功能中有一项宣传是对比较热门的Unity3d引擎的手游保护方案&#xff0c;其中对Dll文件的保护介绍如下&#xff0c; “Dll加固混淆针对Unity游戏&#xff0c;对Dll模块的变量名、函数名、类名进行加密混淆处理&…

力扣刷题-122买卖股票的最佳时机

题目要求如上&#xff0c;这里可以有两种解题思路&#xff0c;一种是利用动态规划去求解&#xff0c;一种是用贪心去求解。 首先看下动态规划的方法。 用动归去解决 动态规划最重要的就是要想出来递推公式&#xff08;这个真的很难&#xff09;&#xff0c;但是一旦想清楚递推…

BootStrap完整页面尝试(感兴趣的同学可以做)

试采用BootStrap技术或者htmlcss&#xff0c;完成以下页面。 题目为选做&#xff0c;有兴趣的同学可以尝试。

货代FOB条款卖方必备的知识:发货人都要承担哪些费用呢?

据统计&#xff0c;中国出口中以FOB成交的占到70%&#xff0c;但专家指出&#xff1a;FOB对出口商的风险更大&#xff0c;有可能造成货、款两空的结局。 目前我国出口合同以FOB价格条款成交的比例越来越大&#xff0c;而且收货人指定船公司的少&#xff0c;指定境外货代的多&am…