数字图像处理实验(二)|图像变换(附实验代码和截图)

news2024/9/22 19:24:59

文章目录

  • 一、实验目的
  • 二、主要仪器设备
  • 三、实验原理
    • (一)变换原理
      • 1.离散傅里叶变换
      • 2.离散余弦变换
      • 3.频谱平移
    • (二)频谱分析原理
  • 四、实验步骤和内容
    • 1. 为下面三段程序写出注释并上机运行,将实际运行结果如实记录到实验报告,并分析三段程序的不同之处,并解释第一段程序出现问题的原因。
    • 2.选取一幅标准测试图像实现傅里叶变换。
    • 3.频谱平移
    • 4. 选取一幅标准测试图像实现离散余弦变换。
    • 5.记录和整理实验报告。
  • 五、思考题
  • 六、实验代码
  • 七、实验图像

一、实验目的

1了解图像变换的原理;
2理解图像变换系数的特点;
3掌握图像变换的方法及应用;
4掌握图像的频谱分析方法;
5了解图像变换在图像数据压缩、图像滤波等方面的应用。

二、主要仪器设备

安装了MATLAB软件的台式或笔记本电脑

三、实验原理

(一)变换原理

1.离散傅里叶变换

对于二维离散信号,Fourier正变换定义为:
在这里插入图片描述
二维离散傅立叶逆变换为:
在这里插入图片描述
相关函数:fft2; ifft2

2.离散余弦变换

正变换公式为:
在这里插入图片描述
逆变换公式为:
在这里插入图片描述
相关函数:dct2; idct2

3.频谱平移

相关函数:fftshift; ifftshift
例题:
图像的二维离散傅立叶变换
I=imread(‘coins.png’); %读入原图像文件
imshow(I); %显示原图像
fftI=fft2(I); %二维离散傅立叶变换
sfftI=fftshift(fftI); %直流分量移到频谱中心
RR=real(sfftI); % real(A)为取复数A的实部
II=imag(sfftI); %imag(A)为取复数A的虚部
A=sqrt(RR.^ 2+II.^2); %计算频谱幅值
B=abs(sfftI);
I1=ifft2(fftI); %重建原图像
figure; %创建窗口
imshow(uint8(A)); %显示原图像的频谱

(二)频谱分析原理

图像变换是能量的重新分配。频率域中低频部分对应的是图像中的平滑部分(灰度变化缓慢的区域,)高频部分对应的是图像中的边缘、细节或噪声部分。
本实验主要函数:
fft2; ifft2; dct2; idct2; abs; angle; fftshift; ifftshift; imshow ; subplot; title

四、实验步骤和内容

1. 为下面三段程序写出注释并上机运行,将实际运行结果如实记录到实验报告,并分析三段程序的不同之处,并解释第一段程序出现问题的原因。

(1)f = imread ( ‘pout.tif’);
F=fft2(f);
S=abs(F);
imshow(S);
f1=ifft2(F);
figure;imshow(f1);

(2)f1 = imread (‘pout.tif’);
f=im2double(f1);
F=fft2(f);
S=abs(F);
imshow(uint8(S));
f1=ifft2(F);
figure;imshow(f1);

(3)f1 = imread (‘pout.tif’);
f=im2double(f1);
F=fft2(f);
S=uint8(abs(F));
imshow(S);
S1=fftshift(F);
figure;imshow(uint8(abs(S1)));
f11=ifft2(F);
figure;imshow(f11);

2.选取一幅标准测试图像实现傅里叶变换。

(1)读图图像;
(2)显示原图像;
(3)进行傅里叶正变换;
(4)获取其幅度谱和相位谱;
(5)利用逆变换对图像进行重建。

3.频谱平移

选取一幅灰度图像,对其进行傅里叶变换、频谱平移、频谱逆平移、傅里叶逆变换,并在同一窗口中同时显示原图像、傅里叶变换频谱、频谱平移图像、逆平移频谱图像及傅里叶逆变换图像并按上述名称命名。将程序及效果图记录入实验报告。

4. 选取一幅标准测试图像实现离散余弦变换。

(1)读图图像;
(2)显示原图像;
(3)进行离散余弦正变换;
(4)利用逆变换对图像进行重建;
(5)对(3)中的系数进行取舍。
(6)用(5)中得到的系数矩阵对图像进行重建(逆变换),得到新图像;
(7)在同一窗口显示原图像、频谱图、直接重建图像、改变系数后的重建图像;
(8)分析两个重建的图像的图像质量变化以及产生的原因。
离散余弦变换后,将低频分量其中到了左上角,所以程序中是保留了左上角33*33的小矩阵的信息量,而其他信息都舍弃了,因此重建后的图像变得模糊了。

5.记录和整理实验报告。

五、思考题

1.傅里叶变换有哪些重要的性质?
可以将低频和高频信号区分开来,将图像的灰度分布函数变换为图像的频率分布函数。
2.离散余弦变换与傅里叶变化相比有哪些优势?
离散余弦变换首先低频信号都是集中在左上角,并且相对于傅里叶变换是不用进行频谱搬移的
3.观察图像变换后的频谱矩阵系数,总结变换后系数分布特点。
都是双精度,并且落在(-1,1)的区间

六、实验代码

%% 1.1
f = imread ('pout.tif'); 
f = im2double(f)  %没有对图像进行归一化(为什么进行归一化?)
F=fft2(f);       
S=abs(F);      
imshow(uint8(S)); %没有对复数模值进行[0,255]进行映射          
f1=ifft2(F);
figure;imshow(f1);

%% 1.2 
f1 = imread ('pout.tif'); 
f=im2double(f1); %将图像转换为双精度(归一化)
F=fft2(f); % 进行傅里叶变化
S=abs(F);  % 对复数取模值
imshow(uint8(S));  % 将数据映射到[0,255](频谱图)并显示
f1=ifft2(F); % 对傅里叶进行逆变换
figure;imshow(f1);  % 显示

%% 1.3 
clc,clear
close all
f1 = imread ('pout.tif'); 
f=im2double(f1); 
F=fft2(f);
S=uint8(abs(F));           
imshow(S);
S1=fftshift(F); %频谱平移,将直流分量移到频谱中心
figure;imshow(uint8(abs(S1)));
f11=ifft2(F);
figure;imshow(f11);

%% 2
clc,clear
close all
f = imread ('pout.tif');
f_y = im2double(f);
f_n = fft2(f);   % 未im2double的傅里叶变换
f_y = fft2(f_y); % 经过im2double的傅里叶变换

RR_y = real(f_y); %实部
II_y = imag(f_y); %虚部
RR_n = real(f_n);
II_n = imag(f_n);

A_y = sqrt(RR_y.^2+II_y.^2); % 求取距离(频谱)
B_y = angle(f_y);            % 求取相位
C_y = abs(f_y);              % 求取距离

A_n = sqrt(RR_n.^2+II_n.^2);
B_n = angle(f_n);
C_n = abs(f_n);

S_y = fftshift(f_y);         %频谱平移
S_n = fftshift(f_n);


figure
subplot(2,3,1);imshow(f);xlabel('原图像')
subplot(2,3,2);imshow(A_y);xlabel('幅度谱');title('经过im2double处理')
subplot(2,3,3);imshow(B_y);xlabel('相位谱')
subplot(2,3,4);imshow(uint8(A_y));xlabel('频谱图')
subplot(2,3,5);imshow(uint8(abs(S_y)));xlabel('频谱平移图')
subplot(2,3,6);imshow(ifft2(f_y));xlabel('图像进行重建')


% figure
I_y = ifftshift(S_y);
I_n = ifftshift(S_n);
figure
subplot(1,2,1);imshow(uint8(abs(I_y)));xlabel('y_逆平移')
subplot(1,2,2);imshow(uint8(abs(I_n)));xlabel('n_逆平移')
%% 3
f1 = imread ('pout.tif'); 
f=im2double(f1); % 0-1变小;
F=fft2(f1);
F1 = fft2(f)
S=uint8(abs(F));           
S1=fftshift(F); %频谱平移,将直流分量移到频谱中心
S2=ifftshift(S1);
f11=ifft2(F);
figure
subplot(2,3,1);imshow(f1);xlabel('原图像')
subplot(2,3,2);imshow(S);xlabel('傅里叶变换频谱')
subplot(2,3,3);imshow(uint8(abs(S1)));xlabel('频谱平移图像')
subplot(2,3,4);imshow(uint8(abs(S2)));xlabel('逆平移频谱图像')
subplot(2,3,5);imshow(uint8(f11));xlabel('傅里叶逆变换图像')

%% 4
f = imread ('pout.tif');
f1 = im2double(f);
f_dct = dct2(f1);
f_idct = idct2(f_dct);
Z = zeros(291,240);
Z(1:33,1:33) = 1;
f_dct_d = Z.*f_dct;
f_idct_d = idct2(f_dct_d);
figure
subplot(2,2,1);imshow(f);xlabel('原图像')
subplot(2,2,2);imshow(abs(f_dct));xlabel('频谱图')
subplot(2,2,3);imshow(f_idct);xlabel('直接重建图像')
subplot(2,2,4);imshow(f_idct_d);xlabel('改变系数后重建图像') 

七、实验图像

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

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

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

相关文章

《数据结构》队列

学习目录队列队列的概念队列的使用(Queue)队列的模拟实现循环队列双端队列(Deque)面试题队列 队列的概念 队列是一种先进先出,后进后出的特点,是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表…

selenium使用

selenium使用一 bs4搜索文档树二 css选择器三 selenium基本使用四 无界面浏览器五 selenium其它用法5.1 登录百度5.2 获取位置属性大小,文本5.3 元素操作5.4 执行js代码5.5 切换选项卡5.6 浏览器前进后退5.7 异常处理六 selenium登录cnblogs获取cookie七 抽屉半自动…

kubernetes使用(1.25)

kubernetes使用(1.25) 内核是AMD、ARM、 $ arch uname -a 注:x86_64,x64,AMD64基本上是同一个东西 K8S 核心概念 Kubernetes有很多核心概念,我们先看下几个核心的概念。其他概念可以看一下我的安装文档 Deployment Deploy…

实现国产化转型,ZStack Cloud 助力中铁财务数字化转型!

中铁财务是中国中铁旗下的金融服务核心企业,随着新业务的快速发展,原有的烟囱式架构使得资源利用率相对较低,难以与其他系统有效协调工作。基于国产化布局的需要,中铁财务选择了 ZStack Cloud 云平台,在充分利旧的基础…

UNIAPP实战项目笔记47 显示默认收货地址和修改收货地址页面的布局

UNIAPP实战项目笔记47 显示默认收货地址和修改收货地址页面的布局 实际案例图片 显示默认地址 修改收货地址后 地址列表 显示默认地址页面 具体内容图片自己替换哈,随便找了个图片的做示例 具体位置见目录结构 完善布局页面和样式 用到了页面间传值 uni.onu…

[附源码]计算机毕业设计JAVA圆梦山区贫困学生助学系统

[附源码]计算机毕业设计JAVA圆梦山区贫困学生助学系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM…

1163. 按字典序排在最后的子串-解题思路推导

1163. 按字典序排在最后的子串-解题思路推导 给你一个字符串 s ,找出它的所有子串并按字典序排列,返回排在最后的那个子串。 示例 1: 输入:s “abab” 输出:“bab” 解释:我们可以找出 7 个子串 [“a”…

刷爆力扣之种花问题

刷爆力扣之种花问题 HELLO,各位看官大大好,我是阿呆 🙈🙈🙈 今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 😜😜😜 该专栏按照不同类别标签进行刷题,每…

YOLOv7 Backbone| 原文源码详解

YOLOv7 Backbone结构详解在之前的文章中,我们以YOLOv5为对象,详细解剖了一只麻雀的内部构造,包括anchor机制、backbone的结构、neck的结构和head的结构。在本篇文章中,我们将以YOLOv7v0.1版本的代码为目标,结合作者团队…

骨骼动画——2D Animation

1、2D骨骼动画 传统的序列帧动画为了达到好的动画效果,理论上来说,图片越多,动作越流畅,往往需要较多的美术资源,虽然效果好但是资源占用较多 而2D骨骼动画是利用3D骨骼动画的制作原理进行制作的,将一张2…

借助 ChatGPT 编写的 libbpf eBPF 工具开发实践教程: 通过例子学习 eBPF

这是一个基于 CO-RE(一次编译,到处运行)的 libbpf 的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践指南,包括基本概念、代码实例、实际应用等内容。我们主要提供了一些 eBPF 工具的案例,帮助开发者…

大学免费查题接口

大学免费查题接口 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点击跳…

设计模式-day02

4,创建型模式 4.2 工厂模式 4.2.1 概述 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设…

蓝牙学习六(GATT)

1.简介 GATT-Generic Attribute profle-通用属性配置文件。GATT层是传输真正数据所在的层。包括了一个数据传输和存储架构以及其基本操作。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT&…

查题接口系统

查题接口系统 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转) 题库…

Bootstrap-jqgrid学习(十六)

jqgrid网站地址: jqGrid demos-jqGrid实例-中文-mn886.nethttps://blog.mn886.net/jqGrid/ 表格属性 分页属性: pagerstring定义翻页用的导航栏,必须是有效的html元素。翻页工具栏可以放置在html页面任意位置 显示总条数 viewrecordsbo…

#分支语句详解

第一章 C语言:分支语句 文章目录第一章 C语言:分支语句前言1、什么是语句?2.分支语句(选择结构)2.1 if语句2.1.1 悬空else2.1.2 if书写形式的对比2.2 switch语句2.2.1 在switch语句中的 break2.2.2 default子句2.2.3 练…

基于频谱的GCN的数学原理

参考链接:如何理解GCN?知乎回答:从热传导模型到GCN从CNN到GCN的联系与区别——GCN从入门到精(fang)通(qi) GCN问题本质 图中的每个结点无时无刻不因为邻居和更远的点的影响,而在改…

基于linux的操作系统的通用启动流程(一)

这篇我们讲解linux的通用启动流程,按照我们一贯的方式总分总的节奏,因为后面的每个子系统也很大,所以我们讲解子系统的时候也是按照总分总的方式。注意因为基于linux的各式各样的操作系统绝对不下100个,像嵌入式,然后我们的桌面有fedora,redhat,centos,debian,ubuntu以…

如何定位线上CPU占用过高的问题

系列文章目录 文章目录系列文章目录前言一、定位CPU的流程是什么?二、实操1.测试代码样例2.定位问题实践过程总结前言 一、定位CPU的流程是什么? 项目上线,CPU飙高不下,触发报警,如何定位排查问题。有两种办法1、通过…