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

2024-06-03 10:44

本文主要是介绍计算机视觉与模式识别实验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()

这篇关于计算机视觉与模式识别实验1-4 图像的傅立叶变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026763

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

计算机视觉工程师所需的基本技能

一、编程技能 熟练掌握编程语言 Python:在计算机视觉领域广泛应用,有丰富的库如 OpenCV、TensorFlow、PyTorch 等,方便进行算法实现和模型开发。 C++:运行效率高,适用于对性能要求严格的计算机视觉应用。 数据结构与算法 掌握常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划等),能够优化代码性能,提高算法效率。 二、数学基础

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能模块,旨在实现对停车场资源的高效配置和实时监控。此外,系统还提供了资讯管理和统计查询功能,帮助管理者及时发布信息并进行数据分析,为停车场的科学

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.