计算机视觉与模式识别实验1-4 图像的傅立叶变换

文章目录

    • 🧡🧡实验流程🧡🧡
      • 1. 傅立叶变换
        • 1.a 绘制一个二值图像矩阵,并将其傅立叶函数可视化。
        • 1.b 利用傅立叶变换分析两幅图像的相关性,定位图像特征。读入图像‘text.png',抽取其中的字母‘a’
      • 2. 离散余弦变换(DCT)
        • 2.a 使用dct2对图像‘autumn.tif’进行DCT变换
        • 2.b 将上述DCT变换结果中绝对值小于10的系数舍弃,使用idct2重构图像并与原图像比较。
        • 2.c 利用DCT变换进行图像压缩
      • 3. 对(1)和(2)中经过FFT和DCT的图像进行反变换,试图保留不同维度的低频信息,将去掉的高频成分设置为0,显示保留不同维度的低频信息反变换后的图像,分析保留不同维度下反变换图像的质量区别
      • 4.讨论不同的图像内容与FFT、DCT频谱之间的对应关系
    • 🧡🧡全部代码🧡🧡

🧡🧡实验流程🧡🧡

1. 傅立叶变换

1.a 绘制一个二值图像矩阵,并将其傅立叶函数可视化。

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.b 利用傅立叶变换分析两幅图像的相关性,定位图像特征。读入图像‘text.png’,抽取其中的字母‘a’

两个函数的卷积的傅立叶变换等于两个函数的傅立叶变换的乘积,与快速傅立叶变换一
起,可以快速计算函数的卷积,进而用于对某些模板对应的特征进行定位:
fft(f1f2)=fft(f1)x fft(f2)
f1
f2=ifft(fft(f1)x fft(f2))
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2. 离散余弦变换(DCT)

2.a 使用dct2对图像‘autumn.tif’进行DCT变换

在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.b 将上述DCT变换结果中绝对值小于10的系数舍弃,使用idct2重构图像并与原图像比较。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.c 利用DCT变换进行图像压缩

在这里插入图片描述
在这里插入图片描述

3. 对(1)和(2)中经过FFT和DCT的图像进行反变换,试图保留不同维度的低频信息,将去掉的高频成分设置为0,显示保留不同维度的低频信息反变换后的图像,分析保留不同维度下反变换图像的质量区别

对(1)中的图,逐步将高频部分(中心化后,中心是低频点,向外扩展是高频点,这里取正方形最外围四条边的高频点为0,并逐渐向内缩)
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述



离散余弦变换的频谱图中,低频主要集中于左上角,高频集中于右下角。随着高频区域逐渐缩小(黑色),图像逐渐变得清晰。
在这里插入图片描述

4.讨论不同的图像内容与FFT、DCT频谱之间的对应关系

频谱中的一个点,不是对应图像的一个点,而是一种对于图像的全局信息,反映的是原图像中具有该灰度变化快慢规律的图像区域(可能不止一个)及其灰度峰值(亮暗)信息。
图像频谱图上的高频部分表示原图像上灰度发生急剧变化的区域,意味着该区域可能出现了边缘、轮廓、细节或噪声信息;低频部分则表示原图像上灰度基本不变或变化很小的区域,代表图片中大片图像区域。
在FFT的二维频谱图中,经过中心化移动后,最中间的点表示低频,向外频率逐渐增加,一般来说具有对称性,以中心点为圆心,做一个圆,这个圆上的每个点频率相同,而相位不一样。而图中的亮点可以理解为表示该点所在频率下对应的灰度变化曲线的幅值(灰度峰值)的大小。然后一般来说,原图像平移,对应的频谱图不会变化;而原图像旋转,则频谱图也会随之相同的角度进行旋转。
而在DCT的频谱图中,低频主要集中于左上角,高频集中于右下角。
在这里插入图片描述在这里插入图片描述

🧡🧡全部代码🧡🧡

import cv2
import numpy as np
import matplotlib.pyplot as plt
"""4-1-a 绘制一个二值图像矩阵,并将其傅立叶函数可视化
"""
# 创建一个30x30的零矩阵
f = np.zeros((30, 30))
# 在指定位置添加矩形
f[4:24, 12:18] = 1# 显示原始图像
plt.imshow(f, 'gray', interpolation='nearest')
plt.title('Original Image')
plt.show()# 计算二维FFT
F = np.fft.fft2(f)
F2 = np.log(np.abs(F)+1e-8)# 计算FFT的幅度谱,并取对数
plt.imshow(F2, cmap='jet') # 显示FFT的幅度谱
plt.title('FFT Magnitude Spectrum')
plt.colorbar()
plt.clim(-1, 5)  # 设置颜色条范围为 -1 到 5
plt.show()# 进行零填充至256x256
F = np.fft.fft2(f, (256, 256))
F2 = np.log(np.abs(F)+1e-8)# 计算FFT的幅度谱,并取对数
plt.imshow(F2, cmap='jet') # 显示零填充后的FFT幅度谱
plt.title('Zero-Padded FFT Magnitude Spectrum')
plt.colorbar()
plt.clim(-1, 5)  # 设置颜色条范围为 -1 到 5
plt.show()# 对FFT进行频率中心移动
F2 = np.fft.fftshift(F)
F2 = np.log(np.abs(F2)+1e-8)# 计算FFT的幅度谱,并取对数
plt.imshow(F2, cmap='jet') # 显示移动中心后的FFT幅度谱
plt.title('Shifted FFT Magnitude Spectrum')
plt.colorbar()
plt.clim(-1, 5)  # 设置颜色条范围为 -1 到 5
plt.show()
"""4-1-b 利用傅立叶变换分析两幅图像的相关性,定位图像特征。读入图像‘text.png',抽取其中的字母‘a’
"""# 读取图像并转换为灰度图像
bw = cv2.imread('img/tes1_text.png', cv2.IMREAD_GRAYSCALE)
a = bw[31:45, 87:98]  # 提取感兴趣区域# 显示原始图像
plt.imshow(bw, cmap='gray')
plt.title('Original Image')
plt.show()# 显示感兴趣区域
plt.imshow(a, cmap='gray')
plt.title('Region of Interest')
plt.show()# 计算相关性
C = np.real(np.fft.ifft2(np.fft.fft2(bw) * np.fft.fft2(np.rot90(a, 2), bw.shape)))# 显示相关性矩阵
plt.imshow(C, cmap='gray')
plt.title('Cross-correlation Matrix')
plt.colorbar()
plt.show()# 使用阈值对相关性矩阵进行二值化并显示结果
thresh = np.max(C)
binary_image1 = C > thresh - 10
binary_image2 = C > thresh - 15plt.imshow(binary_image1, cmap='gray')
plt.title('Binary Image (Threshold - 10)')
plt.show()plt.imshow(binary_image2, cmap='gray')
plt.title('Binary Image (Threshold - 15)')
plt.show()
"""4-2-a 离散余弦变换:使用dct2对图像‘autumn.tif’进行DCT变换
"""
from skimage import io, color# 读取图像 
RGB = io.imread('img/test1_autumn.tif')
plt.imshow(RGB)
plt.title('Original Image')
plt.show()# 转换为灰度图像 
I = color.rgb2gray(RGB)
plt.imshow(I, cmap='gray')
plt.title('Grayscale Image')
plt.show()# 进行二维离散余弦变换(DCT) 
J = np.fft.fft2(I)
plt.imshow(np.log(np.abs(J)), cmap='jet')
plt.colorbar()
plt.clim(-10, 10)
plt.title('DCT of Grayscale Image')
plt.show()
"""4-2-b 将上述DCT变换结果中绝对值小于10的系数舍弃,使用idct2重构图像并与原图像比较。
"""from skimage import io, color
from scipy.fftpack import dctn, idctn# 读取图像
RGB = io.imread('img/test1_autumn.tif')
I = color.rgb2gray(RGB) # 转换为灰度图像
plt.imshow(I, cmap='gray')
plt.title('Original Gray Image')
plt.show()# 进行二维离散余弦变换(DCT)
J = dctn(I, type=2)# 进行反变换
K = idctn(J, type=2)
plt.imshow(K, cmap='gray')
plt.title('Reconstructed Image from DCT')
plt.show()# 舍弃系数
threshold = 10
J[np.abs(J) < threshold] = 0# 反变换舍弃系数后的结果
K2 = idctn(J, type=2)
plt.imshow(K2, cmap='gray')
plt.title('Reconstructed Image after Coefficient Thresholding')
plt.show()
"""4-2-c 利用DCT变换进行图像压缩
"""
from scipy.fftpack import dct, idct
from skimage.io import imread, imshow# 读取图像
I = imread('img/test1_cameraman.tif')
I = I.astype(float) / 255.0  # 将图像转换为双精度,范围从[0,255]转换为[0,1]# 定义DCT变换矩阵
T = dct(np.eye(8), axis=0, norm='ortho')# 对图像进行8x8块DCT变换
B = np.zeros_like(I)
for i in range(0, I.shape[0], 8):for j in range(0, I.shape[1], 8):B[i:i+8, j:j+8] = dct(dct(I[i:i+8, j:j+8], axis=0, norm='ortho'), axis=1, norm='ortho')# 定义掩码
mask = np.array([[1, 1, 1, 1, 0, 0, 0, 0],[1, 1, 1, 0, 0, 0, 0, 0],[1, 1, 0, 0, 0, 0, 0, 0],[1, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0]])# 对每个块应用掩码
B2 = np.zeros_like(B)
for i in range(0, B.shape[0], 8):for j in range(0, B.shape[1], 8):B2[i:i+8, j:j+8] = B[i:i+8, j:j+8] * mask# 对图像进行反DCT变换
I2 = np.zeros_like(I)
for i in range(0, I.shape[0], 8):for j in range(0, I.shape[1], 8):I2[i:i+8, j:j+8] = idct(idct(B2[i:i+8, j:j+8], axis=0, norm='ortho'), axis=1, norm='ortho')# 显示原始图像和处理后的图像
plt.imshow(I, cmap='gray')
plt.title('Original Image')
plt.show()plt.imshow(I2, cmap='gray')
plt.title('Processed Image')
plt.show()
"""4-3 对(1)中经过FFT和DCT的图像进行反变换
"""
# 创建一个30x30的零矩阵
f = np.zeros((30, 30))
# 在指定位置添加矩形
f[4:24, 12:18] = 1# 计算二维FFT
F = np.fft.fft2(f)# 进行频率中心移动
F_shifted = np.fft.fftshift(F)# 定义不同维度下保留的低频信息范围
dimensions = [0,5,10, 13]# 显示保留不同维度下的低频信息反变换后的图像
for dim in dimensions:# 将中心周围的高频部分设置为零F2 = F_shifted.copy()rows, cols = F2.shapeF2[0:30, 0:dim] = 0F2[0:dim, 0:30] = 0F2[30-dim:30, 0:30] = 0F2[0:30, 30-dim:30] = 0F2_copy=F2.copy()# 显示频谱图F2=np.log(np.abs(F2)+1e-8)plt.imshow(F2,'gray')plt.title(f"Spectrogram (Dimensions = {dim})")plt.show()# 进行逆FFTf_filtered = np.fft.ifft2(np.fft.ifftshift(F2_copy)).real# 显示反变换后的图像plt.imshow(f_filtered, 'gray')plt.title(f'Reconstructed Image (Dimensions = {dim})')plt.colorbar()plt.show()
"""4-3 对(2)中经过FFT和DCT的图像进行反变换
"""
from skimage import io, colorRGB = io.imread('img/test1_autumn.tif')
I = color.rgb2gray(RGB) # 转换为灰度图像 
J = np.fft.fft2(I) # 进行二维离散余弦变换(DCT) # 设置要保留的低频信息的维度
dimensions_to_keep = [10, 30, 100]  # 可以根据需要调整reconstructed_images = []
spectrogram_images=[]# 对每个维度进行反变换并保留低频信息
for dim in dimensions_to_keep:# 将高频成分设置为0J_reduced = J.copy()J_reduced[dim:, :] = 0J_reduced[:, dim:] = 0J_reduced_copy=J_reduced.copy()J_reduced=np.log(np.abs(J_reduced)+1e-8)spectrogram_images.append(J_reduced)# 进行逆离散余弦变换(IDCT)I_reconstructed = np.fft.ifft2(J_reduced_copy).realreconstructed_images.append(I_reconstructed)# 显示不同维度下的频谱图
plt.figure(figsize=(15, 5))
for i, dim in enumerate(dimensions_to_keep):plt.subplot(1, len(dimensions_to_keep), i + 1)plt.imshow(spectrogram_images[i],cmap='gray')plt.title(f"Spectrogram (Dimensions = {dim})")plt.axis('off')
plt.show()# 显示保留不同维度下反变换图像
plt.figure(figsize=(15, 5))
for i, dim in enumerate(dimensions_to_keep):plt.subplot(1, len(dimensions_to_keep), i + 1)plt.imshow(reconstructed_images[i], cmap='gray')plt.title(f'Dimension {dim} Kept')plt.axis('off')
plt.show()

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

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

相关文章

2024年5月2日 Go生态洞察:Go 1.22中的安全随机性

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a;…

JavaEE IO流(1)

1.什么是IO流 &#xff08;1&#xff09;input输入 Output输出 这两个的首字母就是IO的组成 &#xff08;2&#xff09;比如你的电脑可以通过网络上传文件和下载文件 这个上传文件就是Output 这个下载翁建就是input (3)这个输入和输出的标准是以CPU为参照物为基准的 其中通…

Python编程基础1

Python特点&#xff1a; 高级&#xff1a;有高级的数据结构&#xff0c;缩短开发时间与代码量。 面向对象&#xff1a;为数据和逻辑相分离的结构化和过程化编程添加了新的活力。 可升级&#xff1a;提供了基础的开发模板&#xff0c;可以在它上面开发软件&#xff0c;实现代码的…

问答机器人

怎样做自己的问答机器人&#xff1f; 根据我们提供的数据分析出问题的答案&#xff0c;我们并不需要训练自己的模型 微调模型 finetune&#xff0c;将语言模型调成另外的语言模型&#xff0c;更适合不同类型数据&#xff0c;运用finetune方法将模型变化 知识库模型 embedd…

关系型数据库面经(数据库系统概论)

下面是我在面试中被问到的关系型数据库的问题并且我回答得不是很好的题目&#xff0c;写个博客记录一下。 下面用于实现数据存储安全性的SQL语句是&#xff1f; 实现数据存储安全性通常涉及到权限管理和加密等手段。在SQL中&#xff0c;用于控制数据访问权限的语句主要是GRAN…

【最新鸿蒙应用开发】——什么是应用开发模型?Stage模型

在应用程序开发时通常需要使用应用模型来提供必备的组件和运行机制&#xff0c;有了应用模型&#xff0c;开发者可以基于一套统一的模型进行应用开发&#xff0c;使应用开发更简单、高效。接下来谈谈鸿蒙应用开发当中的两种模型&#xff1a; Stage模型&#xff1a; HarmonyOS …

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:人工智能消防应用

青鸟消防股份有限公司成立于2001年6月&#xff0c;于2019年8月在深圳证券交易所挂牌上市&#xff0c;成为中国消防报警行业首家登陆A股的企业。公司始终聚焦于消防安全与物联网领域&#xff0c;主营业务为“一站式”消防安全系统产品的研发、生产和销售。公司产品已覆盖了火灾报…

【NOIP提高组】方格取数

【NOIP提高组】方格取数 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 设有N*N的方格图&#xff0c;我们将其中的某些方格填入正整数&#xff0c; 而其他的方格中放入0。 某人从图得左上角出发&#xff0c;可以向下走&#xff0c;也可以向…

vue2 bug求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)

我的vue2项目出现了一个超级恶心的bug 具体流程&#xff1a; 页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 返回页面后页面没有刷新导致用户名还显示这 项目中没有用keep-alive缓存 也在设置了key 尝试了window.addEventListe…

idea实用快捷键(持续更新...)

文章目录 1、快速输入try/catch/finally2、选中多个光标3、实现接口4、方法参数提示5、查看某个类的子类6、弹出显示查找内容的搜索框 1、快速输入try/catch/finally CtrlAltT 2、选中多个光标 ShiftAlt单机多选 End可以全部到行尾&#xff0c;Home则可以全部回到行首 3、实现接…

Python深度学习基于Tensorflow(14)人脸检测和识别实例

文章目录 人脸检测研究现状传统的人脸检测算法深度学习人脸检测算法 人脸识别实战人脸检测人脸对齐人脸标准化人脸表示人脸验证 参考资料 人脸检测研究现状 这里直接引用了吴伟硕士毕业论文 随着计算能力的飞速提升和创新性的传感、分析、渲染设备和技术的广泛应用&#xff0c…

LoRA低秩自适应微调技术原理及实践

大型语言模型的低秩自适应 (LoRA) 用于解决微调大型语言模型 (LLM) 的挑战。GPT 和 Llama 等模型拥有数十亿个参数&#xff0c;通常对于特定任务或领域进行微调的成本过高。LoRA 保留了预训练的模型权重&#xff0c;并在每个模型块中加入了可训练层。这显著减少了需要微调的参数…

k8s学习--ConfigMap详细解释与应用

文章目录 一 什么是configmapConfigMap 的好处ConfigMap 的限制 二.创建ConfigMap的4种方式1.在命令行指定参数创建2.在命令行通过多个文件创建3.在命令行通过文件提供多个键值对创建4.YAML资源清单文件创建 三 configmap的两种使用方法1.通过环境变量的方式传递给pod2.通过vol…

MySQL学习——影响选项文件处理的命令行选项和程序选项修改器

大多数支持选项文件的MySQL程序都处理以下选项。因为这些选项会影响选项文件的处理&#xff0c;所以必须在命令行上给出&#xff0c;而不是在选项文件中给出。为了正常工作&#xff0c;这些选项中的每一个都必须先于其他选项给出&#xff0c;但以下情况除外&#xff1a; -prin…

WLAN组网模型探究

目录 一、WLAN基本概念二、WLAN组网方式三、WLAN转发模型 随着信息技术的飞速发展&#xff0c;无线局域网&#xff08;WLAN&#xff09;已逐渐成为企业网络架构中不可或缺的一部分。不同的企业组织因其业务特性、规模大小及安全需求的不同&#xff0c;对WLAN的要求也各有侧重。…

物联网面试准备

volatile的作用 volatile关键字用于告诉编译器&#xff0c;该变量可能会在程序的执行过程中被意外更改&#xff0c;因此编译器不应该对该变量进行优化或者缓存。 这样可以确保每次访问该变量时都会从内存中读取最新的值&#xff0c;而不是使用缓存中的旧值。 在多线程编程中&…

Arduino IDE 2.3.2找不到端口解决方法

Arduino IDE 2.3.2找不到端口解决方法 问题描述 Arduino IDE 2.3.2 软件找不到端口(端口显示灰色)&#xff0c;Arduino开发板连接电脑后&#xff0c;设备管理器能够看到端口信息&#xff0c;Arduino IDE软件中看不到端口。 设备管理器中能够看到端口信息 Arduino IDE中端口显…

植物大战僵尸杂交版(最新版)

杂交版1.0文件链接 链接&#xff1a;https://pan.baidu.com/s/1Ew6iTg0_d_Ut8N9_18KGLw 提取码&#xff1a;yspa 杂交版2.0文件链接 链接:https://pan.baidu.com/s/1tuchowb4C_oNT6EpqSvr_w?pwdy2fz 提取码:y2fz

HTML静态网页成品作业(HTML+CSS)—— 香奈儿香水介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

上位机图像处理和嵌入式模块部署(f407 mcu中tf卡模拟u盘)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在f407开发板上面&#xff0c;本身是有一个usb接口的。这个usb接口也不仅仅是作为电源使用的&#xff0c;它还可以用来做很多的事情。一方面&#…