计算机视觉与模式识别实验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 - 15

plt.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.shape
    F2[0:30, 0:dim] = 0
    F2[0:dim, 0:30] = 0
    F2[30-dim:30, 0:30] = 0
    F2[0:30, 30-dim:30] = 0
    F2_copy=F2.copy()
    
    # 显示频谱图
    F2=np.log(np.abs(F2)+1e-8)
    plt.imshow(F2,'gray')
    plt.title(f"Spectrogram (Dimensions = {dim})")
    plt.show()
    
    # 进行逆FFT
    f_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, color

RGB = 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:
    # 将高频成分设置为0
    J_reduced = J.copy()
    J_reduced[dim:, :] = 0
    J_reduced[:, dim:] = 0
    J_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).real
    
    reconstructed_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()


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作字符串获取文件名字(包含类型)

记录一种操作字符串获取文件名字的操作方式&#xff0c;方便后期的使用。示例&#xff1a; 输入&#xff1a;"D:/code/Test/Test.txt" 输出&#xff1a;"Test.txt" 设计思路&#xff1a; 首先查找路径中最后一个”/“&#xff0c;然后再通过字符串截取的…

Flutter开发效率提升1000%,Flutter Quick教程之对写好的Widget进行嵌套

通常写代码的时候&#xff0c;我们是先写好外面的Widget&#xff0c;再写里面的Widget。但是&#xff0c;也有的时候&#xff0c;我们写好了一个Widget&#xff0c;但是我们觉得有必要再在外面嵌套一个Widget&#xff0c;这时候应该怎么做呢&#xff1f;&#xff08;还有其他方…

NVIDIA发布重磅AI创新,黄仁勋在COMPUTEX大会预示计算未来

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

coredns 被误删了,可以通过重新应用 coredns 的 Deployment 或 DaemonSet 配置文件来恢复

如果 coredns 被误删了&#xff0c;可以通过重新应用 coredns 的 Deployment 或 DaemonSet 配置文件来恢复。以下是恢复 coredns 的步骤&#xff1a; 1. 下载 coredns 配置文件 你可以从 Kubernetes 的官方 GitHub 仓库下载 coredns 的配置文件。以下是下载并应用配置文件的步…

Android开机动画,framework修改Bootanimation绘制文字。

文章目录 Android开机动画&#xff0c;framework修改Bootanimation动画绘制文字。 Android开机动画&#xff0c;framework修改Bootanimation动画绘制文字。 frameworks/base/cmds/bootanimation/bootanimation.cpp 绘制时间的一个方法 // We render 12 or 24 hour time. void…

使用Landsat的NDVI和NDWI阈值法土地分类

目录 分类效果源代码分类效果 创建一个包含多个层的影像合成:水体(NDWI > 0.5),植被(NDVI > 0.2),阴影区域的裸地(bare2但不包括bare1),和其他裸地(bare1)。然后,使用mosaic()方法合并这些层,并用clip(hh)方法裁剪到研究区域的范围。 源代码 var hh = ee.…

linux 内核映像差异介绍:vmlinux、zImage、zbImage、image、uImage等

一、背景 Linux内核是整个Linux操作系统的核心部分&#xff0c;它是一个负责与硬件直接交互的软件层&#xff0c;并且提供多种服务和接口&#xff0c;让用户程序能够方便地使用硬件资源。 当我们编译自定义内核时&#xff0c;可以将其生成为以下内核映像之一&#xff1a;vmli…

【Matplotlib作图-3.Ranking】50 Matplotlib Visualizations, Python实现,源码可复现

目录 03 Ranking 3.0 Prerequisite 3.1 有序条形图(Ordered Bar Chart) 3.2 棒棒糖图(Lollipop Chart) 3.3 点图(Dot Plot) 3.4 斜率图(Slope Chart) 3.5 杠铃图(Dumbbell Plot) References 03 Ranking 3.0 Prerequisite Setup.py # !pip install brewer2mpl import n…

短视频拍摄的几个必要手法!

如果说视频脚本是制作视频的基础&#xff0c;那么视频拍摄则是视频制作的关键。有了清晰稳定的视频素材&#xff0c;我们才能创作出清晰完整的视频画面。 那么如何拍摄出一个优质清晰稳定的视频画面呢&#xff1f;接下来带大家来学习下视频拍摄的五大技巧。 一、构图是关键 …

深度学习优化技巧

深度学习优化技巧 导语参数更新SGDMomentumAdaGradAdam方法比较 权重初始化关于置0隐藏层激活值分布ReLU权重初值权重比较 Batch Normalization处理过拟合权值衰减Dropout 超参数验证验证数据最优化和实现 总结参考文献 导语 在深度学习中&#xff0c;除了上一章所涉及到的反向…

Kubernetes Pod控制器

一.Pod控制器基本内容 1.定义 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行重启&#xff0c;当根据重启策略…

光纤宽带和ADSL宽带(电话线上网时代)

一、ADSL宽带(电话线上网时代) ADSL技术是一种不对称数字用户线实现宽带接入互连网的技术&#xff0c;ADSL作为一种传输层的技术&#xff0c;充分利用现有的铜线资源&#xff0c;在一对双绞线上提供上行640kbps下行8Mbps的带宽&#xff0c;从而克服了传统用户在最后一公里的瓶颈…

鸿蒙卷起来了!什么是ArkTS?ArkUI?

最近消息出来了&#xff01;纯血鸿蒙即将在六月底发布&#xff0c;市场关于鸿蒙应用开发很火&#xff0c;一些公司企业对鸿蒙开发技术人员更是开出惊人的高薪资。 如果你想要学习鸿蒙应用开发&#xff0c;需要从鸿蒙相关的ArkTS语言开始进入。关于鸿蒙的ArkTS语言&#xff0c;我…

微服务:Rabbitmq的WorkQueue模型的使用、默认消费方式(消息队列中间件)

文章目录 WorkQueue模型控制预取消息个数 WorkQueue模型 当然&#xff0c;一个队列&#xff0c;可以由多个消费者去监听。 来实现一下. 生产者&#xff1a; Testpublic void testWorkQueue() throws InterruptedException {// 队列名称String queueName "simple.queue…

UUID 的用户体验

UUID 的用户体验 唯一标识符&#xff08;UUID&#xff09;在所有应用程序中都起着至关重要的作用&#xff0c;从用户认证到资源管理。虽然使用标准的 UUID 可以满足所有的安全需求&#xff0c;但我们可以为用户做很多改进。 基础知识&#xff1a;确保全局唯一性 唯一标识符对…

UR机器人通信汇总

文章目录 一、概述二、UR机器人通信2.1UR通信协议2.2 UR通信端口 三、UR机器人通信端口类型3.1 Modbus TCP端口&#xff08;502端口&#xff09;3.2 Dashboard端口&#xff08;29999端口&#xff09;3.3 上位机编程端口&#xff08;30001/30002/30003端口&#xff09;3.3.1 URS…

C基础-标准库上

下:http://t.csdnimg.cn/LXa0J C 标准库是一组 C 内置函数、常量和头文件&#xff0c;比如 <stdio.h>、<stdlib.h>、<math.h>&#xff0c;等等。 目录 一. assert.h 二. ctype.h 三. errno.h 四. float.h 五.limits.h 六. locale.h 一. assert.h 源码…

Go语言垃圾回收(GC原理)

1. GC回收机制 1.1 V1.3标记清除法 (1)概述 1.STW暂停 STW(暂停业务逻辑,找出可达和不可达对象) 2.对可达对象做上标记 标记完成之后,对象5和对象6不可达,被GC清除.之后STW结束. (2).缺点 STW :让程序暂停,程序出现卡顿.标记需要扫描整个heap.清除数据会产生heap碎片. 1.…

【linux软件基础知识】与调度相关的进程描述符

进程描述符 每个进程描述符都包括几个与调度相关的字段,如下代码所示: struct thread_struct {unsigned long rsp0;unsigned long rsp;unsigned long userrsp; /* Copy from PDA */ unsigned long fs;unsigned

SprigBoot中的配置优先级 Bean管理

黑马程序员JavaWeb开发教程 文章目录 一、配置优先级1.1 SpringBoot 中支持三种格式的配置文件1.2 Java系统属性 & 命令行参数1.3 总结 二、Bean管理2.1 获取bean2.1.1 在默认情况下 2.2 bean 作用域&#xff08;实际开发中一般不需要考虑&#xff09;2.2.1 bean的作用域2.…