【matlab图像处理笔记5】【图像变换】(四)图像的正交变换

推荐阅读

本系列其他文章

  1. 【matlab图像处理笔记2】【图像变换】(一)图像的算术运算与几何变换、图像插值算法_Twilight Sparkle.的博客-CSDN博客
  2. 【matlab图像处理笔记3】【图像变换】(二)图像的形态学变换_Twilight Sparkle.的博客-CSDN博客
  3. 【matlab图像处理笔记4】【图像变换】(三)图像的霍夫变换_Twilight Sparkle.的博客-CSDN博客

相关文章

参考文章

  1. 如何理解 图像傅里叶变换的频谱图_双子的孤独的博客-CSDN博客_图像傅里叶变换频谱图

前言

本文是现阶段图像变换笔记的最后一篇,将介绍图像的正交变换。

图像正交变换简介

正交变换是数字图像处理的一种有效工具。通过正交变换,我们可以将图像从时域变换到频域进行后续处理。正交变换在图像增强、图像复原、图像压缩、图像特征处理等方面都经常使用。

常用的正交变换有:离散傅里叶变换、离散余弦变换、K-L变换、小波变换等。本篇仅介绍傅里叶变换和离散余弦变换的相关内容,K-L变换和小波变换将会在后续文章补齐(希望吧)。

离散傅里叶变换

图像处理中的离散傅里叶变换其实指的是二维快速离散傅里叶变换。关于傅里叶原理与推导在之前的文章已经详细写过,详情请见"相关文章"。这里默认已经对傅里叶变换/二维离散傅里叶变换有一定了解。

对图像进行离散傅里叶变换的作用

可以将空间域(二维灰度数表)的图像转换到频域(频率数表),使得可以更方便的处理图像,也更有利于进行频域滤波等操作。

二维离散傅里叶变换

公式:
F ( u , v ) = ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − i 2 π ( u x M + v y N ) f ( u , v ) = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 F ( x , y ) e i 2 π ( u x M + v y N ) \begin{split} & F(u,v) = \sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)e^{-i2\pi(\frac{ux}{M}+\frac{vy}{N})} \\ & f(u,v) = \frac{1}{MN}\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}F(x,y)e^{i2\pi(\frac{ux}{M}+\frac{vy}{N})} \end{split} F(u,v)=x=0M1y=0N1f(x,y)ei2π(Mux+Nvy)f(u,v)=MN1x=0M1y=0N1F(x,y)ei2π(Mux+Nvy)
不过实际上要使用二维离散傅里叶变换,是使用的对其进行分治的基础上得到的快速二维傅里叶变换

频谱图

学习图像离散傅里叶变换,一个不得不提的就是对频谱图的理解。光有公式是不够的,还得看懂变换后的频谱图大概代表什么意思。频谱图的内容较多,我在学习时找到了很详细的文章。请见参考教程【1】。推荐先去看频谱图,这里虽然占的篇幅很少,实际上是因为自己太懒了不想重述了。

二维频谱图中每一点都是一个与之一一对应的二维正弦/余弦波。

示例

matlab中使用fft2进行二维(快速)离散傅里叶变换。

使用文档:二维快速傅里叶变换 - MATLAB fft2 - MathWorks 中国

将时域图转化为频域图:

clc;clear;close all; 
load imdemos saturn2;
figure,imshow(saturn2);
title('原图');
X = fft2(saturn2);
figure,imshow(log(abs(X)),[]);
title('2d-fft');
colormap(jet(64)),colorbar;

在频域去阈值后再逆变换

clc;clear;close all; 
load imdemos saturn2;
figure,imshow(saturn2);
title('原图');
X = fft2(saturn2);
figure,imshow(log(abs(X)),[]);
title('2d-fft');
colormap(jet(64)),colorbar;
X(abs(X)<10)=0;
Y = real(ifft2(X)/255);
figure(),imshow(Y,[]);

离散余弦变换

简介

离散余弦变换(Discrete Cosine Transform, DCT)是以一组不同频率和幅值的余弦函数和来近似一幅图像,实际上是傅立叶变换的实数部分。离散余弦变换有一个重要的性质,即对于一幅图像,其大部分可视化信息都集中在少数的变换系数上。因此,离散余弦变换经常用于图像压缩,例如国际压缩标准的JPEG格式中就采用了离散余弦变换。

基本原理

在傅立叶变换过程中,若被展开的函数是实偶函数,则其傅立叶变换中只包含余弦项,基于傅立叶变换的这一特点, 人们提出了离散余弦变换。DCT变换先将图像函数变换成偶函数形式,再对其进行二维离散傅立叶变换,故DCT变换可以看成是一种简化的傅立叶变换

二维离散余弦公式:

对于 ( M , N ) (M,N) (M,N) 的序列矩阵 f ( x , y ) f(x,y) f(x,y),二维离散余弦变换定义如下:

DCT:
F ( u , v ) = a ( u ) a ( v ) ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) c o s ( 2 x + 1 ) u π 2 M c o s ( 2 y + 1 ) u π 2 N F(u,v) = a(u)a(v)\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}f(x,y)cos\frac{(2x+1)u\pi}{2M}cos\frac{(2y+1)u\pi}{2N} F(u,v)=a(u)a(v)x=0M1y=0N1f(x,y)cos2M(2x+1)uπcos2N(2y+1)uπ
其中, u = 0 , 1 , . . . , M − 1 , v = 0 , 1 , . . . , N − 1 u=0,1,...,M-1,v=0,1,...,N-1 u=0,1,...,M1,v=0,1,...,N1
a ( u ) = { 1 M , u = 0 2 M , u ≠ 0 , a ( v ) = { 1 N , v = 0 2 N , v ≠ 0 a(u) =\left\{ \begin{aligned} \frac{1}{\sqrt M},u=0\\ \sqrt \frac{2}{M},u\neq0\\ \end{aligned} \right.,a(v) =\left\{ \begin{aligned} \frac{1}{\sqrt N},v=0\\ \sqrt \frac{2}{N},v\neq0\\ \end{aligned} \right. a(u)= M 1,u=0M2 ,u=0,a(v)= N 1,v=0N2 ,v=0
IDCT:
f ( x , y ) = ∑ x = 0 M − 1 ∑ y = 0 N − 1 a ( u ) a ( v ) F ( u , v ) c o s ( 2 x + 1 ) u π 2 M c o s ( 2 y + 1 ) u π 2 N f(x,y) = \sum_{x=0}^{M-1}\sum_{y=0}^{N-1}a(u)a(v)F(u,v)cos\frac{(2x+1)u\pi}{2M}cos\frac{(2y+1)u\pi}{2N} f(x,y)=x=0M1y=0N1a(u)a(v)F(u,v)cos2M(2x+1)uπcos2N(2y+1)uπ
其中, x = 0 , 1 , . . . , M − 1 , y = 0 , 1 , . . . , N − 1 x=0,1,...,M-1,y=0,1,...,N-1 x=0,1,...,M1,y=0,1,...,N1
a ( u ) = { 1 M , u = 0 2 M , u ≠ 0 , a ( v ) = { 1 N , v = 0 2 N , v ≠ 0 a(u) =\left\{ \begin{aligned} \frac{1}{\sqrt M},u=0\\ \sqrt \frac{2}{M},u\neq0\\ \end{aligned} \right.,a(v) =\left\{ \begin{aligned} \frac{1}{\sqrt N},v=0\\ \sqrt \frac{2}{N},v\neq0\\ \end{aligned} \right. a(u)= M 1,u=0M2 ,u=0,a(v)= N 1,v=0N2 ,v=0

示例

matlab中使用dct2进行二维离散余弦变换。

参考文档:二维离散余弦变换 - MATLAB dct2 - MathWorks 中国

正变换:

clc;clear;close all; 
load imdemos saturn2;
figure,imshow(saturn2);
title('原图');
X = dct2(saturn2);
figure,imshow(log(abs(X)),[]);
title('2d-dct');
colormap(jet(64)),colorbar;

在频域设置阈值并逆变换:

clc;clear;close all; 
load imdemos saturn2;
figure,imshow(saturn2);
title('原图');
X = dct2(saturn2);
figure,imshow(log(abs(X)),[]);
title('2d-dct');
colormap(jet(64)),colorbar;
X(abs(X)<10)=0;
Y = idct2(X)/255;
figure(),imshow(Y);
title('2d-idct');

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Twilight Sparkle.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值