【基于MATLAB的数字图像处理】第三章·基本图像变换

系列文章

 ·【基于MATLAB的数字图像处理】第一章·绪论

·【基于MATLAB的数字图像处理】第二章·视觉系统与图像处理系统

·【基于MATLAB的数字图像处理】第三章·基本图像变换

·【基于MATLAB的数字图像处理】第四章·图像增强

·【基于MATLAB的数字图像处理】第五章·图像编码

·【基于MATLAB的数字图像处理】第六章·形态学图像处理

·【基于MATLAB的数字图像处理】大作业·综合图像处理平台

目录

前言

一、傅里叶变换

1.一维傅里叶变换

 2.二维傅里叶变换

3.傅里叶变换性质

 4.MATLAB示例程序

二、离散余弦变换

1.一维离散余弦变换

 2.二维离散余弦变换

3.应用及MATLAB示例程序

三、小波变换

1.简介

2.MATLAB示例程序


前言

为了有效和快速地对图像进行处理,常常需要将原定义在图像空间的图像以某种形式转换到另外一些空间,并利用在这些空间的特有性质方便地进行一定的加工,最后再转换回图像空间以得到所需的效果。

一般将从图像空间向其他空间的变换称为正变换,而将从其他空间向图像空间的变换称为反变换或逆变换

一般变换后的图像,大部分能量都分布于低频谱段,这对以后图像的压缩\传输都比较有利。

正变换通式:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第1张图片

其中h(x,u)称为正向变换核函数

逆变换通式:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第2张图片

 其中k(x,u)称为逆向变换核函数


一、傅里叶变换

离散傅里叶变换(DFT)描述了离散信号的时域表示和频域表示,经过傅里叶变换可以将时域上的图像转换为频域空间进行分析,是线性系统分析和信号处理中一种非常有效的数学工具。

首先说明,傅里叶变换的数学表达形式原本为积分形式,针对的是连续函数的情况,但是在计算机中,无法识别连续信号,需要对一个连续函数f(x)进行等间隔采样,得到离散形式的傅里叶变换公式,下文都是采用这种形式。

1.一维傅里叶变换

1-D傅里叶正变换公式:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第3张图片

1-D傅里叶反变换公式:

 公式中有exp(j2πux/N)一项,可以通过欧拉公式

e^{j\Theta } = cos(\Theta ) + jsin(\Theta )

将公式进行变换,最终的结果肯定是一个复数,可以写成如下的形式:

 定义频谱(幅度)为F(u)的模:

 定义相位角为复数角的正切:

 2.二维傅里叶变换

2-D傅里叶正变换公式:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第4张图片

 2-D傅里叶逆变换公式:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第5张图片

 同样我们可以定义频谱和相位角:

 但是二维的傅里叶变换公式本身比较复杂,并且对于计算机来说,计算的消耗也很大,我们可以引入一些傅里叶变换的性质,试着简化公式,并减小计算量。

3.傅里叶变换性质

分离性质:

进行一次二维的傅里叶变换性质等同于进行两次一维傅里叶变换,先固定列(v),对x进行累加运算,算出F(x,v),然后再固定行,计算最终的二维傅里叶变换结果:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第6张图片

【基于MATLAB的数字图像处理】第三章·基本图像变换_第7张图片

 这样进行运算可以将进行该算法的时间复杂度由O(N^{4})减少为O(N^{2}),大大减少了计算消耗。

平移性质:

在我们计算图像的频谱时,进行可视化后,得到的低频部分往往分散在四角,这使得我们在想进行滤波操作时很不方便,于是我们可以通过位移性质将低频部分都集中到中央。

【基于MATLAB的数字图像处理】第三章·基本图像变换_第8张图片

 图像在空间平移相当于其变换在频域与一个指数项相乘:

 图像在空间与一个指数项相乘相当于其变换在频域平移:

 旋转性质:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第9张图片

 f(x,y)旋转一个角度对应于将其傅里叶变换F(u,v)也 旋转相同的角度

尺度性质:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第10张图片

  1. 对f(x,y)在幅度方面的尺度变换导致对其傅里叶变换F(u,v)在幅度方面的对应尺度变化
  2. 对 f(x, y) 在空间尺度方面的放缩导致对其傅里叶变换F(u, v)在频域尺度方面的相反放缩,并且使幅度方面减小。

卷积定理:

 在时间域对两个函数做卷积运算,相当于在频率域进行对应的两个函数做乘法。

 4.MATLAB示例程序

这里我们的第一个图像是自己画的一个黑白方块图,第二个图像是提取的Lune女士的图像并旋转了45度,然后进行傅里叶变换,并进行了移位操作,然后使用二维和三维图分别显示。

%% Example from book
clear;clc;
N = 100;
f = zeros(50,50); %50X50零矩阵
f(5:35,23:28) = 1;
F = fft2(f,N,N); %二维傅里叶变换
x1=1:N;y1=1:N;

%移位
F2 = fftshift(abs(F)); %移位



%% 真实图片
image = imread("Lena.tif");
[M,N] = size(image); %获取图像行数和列数
Rot = imrotate(image,45,'bilinear'); %图像旋转45度
F3=fft2(Rot,M,N); % 二维傅里叶变换
x2=1:M;y2=1:N;
F4=fftshift(abs(F3));


%% 图像显示
figure;
% subplot(2,3,3);mesh(x1,y1,abs(F(x1,y1))); %三维网格显示 不移位
subplot(2,3,3);mesh(x1,y1,F2(x1,y1)); %三维网格显示 移位
subplot(2,3,6);mesh(x2,y2,F4(x2,y2));
% colormap(jet);colorbar; %模型渲染
subplot(2,3,1);imshow(f);
subplot(2,3,2);imshow(abs(F),[0,10]);
% subplot(2,3,2);imshow(F2);%移位
subplot(2,3,4);imshow(Rot);
subplot(2,3,5);imshow(abs(F3),[1000,2550]); % 将min显示为黑色,将max显示为白色

 实验效果:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第11张图片


二、离散余弦变换

Fourier变换是在图像变换中最广泛使用的一种变换,但他也存在一些问题,它的参数都是复数,在数据描述方面是实数的两倍,因此提出了离散余弦变换(DCT),离散余弦变换类似于傅里叶变换,但是只使用实数,减少了一般的计算量。

如果函数f(x)是一个连续的实偶函数,那么在进行傅里叶变换时,后面的复数项为奇函数,积分后其值为0,只剩下实数项,这样就简化了运算。

1.一维离散余弦变换

正变换:

 逆变换:

 变换核函数:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第12张图片

 2.二维离散余弦变换

离散余弦变换也是傅里叶变换的一种,因此对于二维离散余弦变换也可以使用分离性质和对称性质,将一次二维离散余弦变换,变为两次一维离散余弦变换。

正变换:

 逆变换:

3.应用及MATLAB示例程序

 离散余弦变换常用于JPEG格式的压缩,也常用于加水印。

经过DCT变换后,能量集中于图像的左上角。

在DCT变换域中,图像被分解为直流(DC)分量和交流(AC)分量,从稳健性的角度看,在保证水印不可见性的前提下,DC分量比AC分量更适合嵌入水印,在DCT域中AC系数又有高频系数和低频系数之分,将水印嵌入高频系数可以获得较好的不可见性,但稳健性较差。另一方面,将水印嵌入低频系数可获得较好的稳健性,但对视觉观察有较大影响。

在实例程序中,我先复现了一下书上的压缩图像的代码,然后又实现了给图像加一个黑色矩形水印的实例。

%% Example_from_book
clear;clc;
RGB=imread("LenaRGB.tif");
GRAY=rgb2gray(RGB); %RGB转为灰度图
subplot(1,3,1);imshow(GRAY); %显示灰度图
D=dct2(GRAY); %进行离散余弦变换
subplot(1,3,2);imshow(abs(D),[]); %显示变换后的图像
colormap(gray(4));colorbar; %色彩渲染
D(abs(D)<0.1)=0; %将DCT值小于0.1的元素设为0
I=idct2(D)/255; %进行余弦逆变换
imwrite(I,"DCTLena.jpeg"); %将图像存储到当前文件夹下
subplot(1,3,3);imshow(I); %在视觉效果上不会差别太大,但有效的节约了大量的存储空间

%% 图像加水印
clear;clc;
figure;
RGB=imread("LenaRGB.tif");
GRAY=rgb2gray(RGB); %RGB转为灰度图
subplot(2,2,1);imshow(GRAY); %显示灰度图
D=dct2(GRAY); %进行离散余弦变换
subplot(2,2,2);imshow(D); %显示变换后的图像
D(20:70,20:100)=0; %在这块区域加一个黑色水印
subplot(2,2,3);imshow(D); %显示添加后的图
K=idct2(D)/255; %傅里叶逆变换
subplot(2,2,4);imshow(K);

实验效果:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第13张图片


三、小波变换

1.简介

傅里叶变换的不足之处:利用傅里叶变换只能获得信号的整个频谱,很难获得信号的局部特征,特别是对于突变信号和非平稳信号,都难以获得希望的结果;其次,在图像分析时,有时需要将信号在时域和频域中的特性或空域和频域中的特性结合起来分析,傅里叶变换不能判断某一时间段的频率成分。

为了解决这个问题,1946年Gabor先提出了加窗的Fourier变换,一定程度上克服了该缺陷,但没从根本上解决问题,因为为了提高局部可观察性,就需要加大窗口,导致计算量大增,因此提出了小波变换,小波变换以局部化函数所形成的的小波基为基底展开,它是一个时间和频率的局域变换,可以通过伸缩和平移等运算功能对函数或信号进行多尺度的细化分析。

【基于MATLAB的数字图像处理】第三章·基本图像变换_第14张图片

 然后将信号在这个函数系上进行分解,就得到了连续小波变换

小波变换的过程:

  1. 把小波ψ(t)和原始信号f(t)的开始部分进行比较
  2. 计算系数c 。该系数表示该部分信号与小波的近似程度。系数 c 的值越高表示信号与小波越相似,因此系数c 可以反映这种波形的相关程度
  3. 把小波向右移,距离为k,得到的小波函数为ψ(t-k),然后重复步骤1和2。再把小波向右移,得到小波ψ(t-2k),重复步骤1和2。按上述步骤一直进行下去,直到信号f(t)结束
  4. 扩展小波ψ(t),例如扩展一倍,得到的小波函数为ψ(t/2)
  5. 重复步骤1~4,通过系数c可以反应不同小波基于信号f(t)的波段近似程度

小波变换核函数:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第15张图片

 将小波变换由一维推广到二维,就可以用于图像处理,实质上相当于分别对图像数据的行和列做一维小波变换。通过水平和垂直滤波,离散小波将原图像分为4个子带图:垂直和水平的低频子带图像LL、水平方向的低频和垂直方向的高频子带图像LH、水平方向的高频和垂直方向的低频子带图HL、垂直和水平的高频子带图HH。

【基于MATLAB的数字图像处理】第三章·基本图像变换_第16张图片

2.MATLAB示例程序

在这个程序中,第一部分进行了小波变换,将低频和高频带显示;第二个示例使用小波变换进行了两幅图像的融合。

%% Example form book part.1
clear;clc;
RGB=imread("LenaRGB.tif");
GRAY=rgb2gray(RGB);
subplot(121);imshow(GRAY);
title("原始图像");
axis square;
axis on;
[c,s]=wavedec2(GRAY,2,'bior3.7'); %使用bior3.7小波进行2层小波分解
ca1=appcoef2(c,s,'bior3.7',1); %提取小波分解结构中第1层低频系数
ch1=detcoef2('h',c,s,1);
cv1=detcoef2('v',c,s,1);
cd1=detcoef2('d',c,s,1);
% 上述三条等价于:[ch1,cv1,cd1]=detcoef2('all',c,s,1);%尺度1的所有方向的高频系数
%分别对各频率成分进行重构
al=wrcoef2('a',c,s,'bior3.7',1);
hl=wrcoef2('h',c,s,'bior3.7',1);
vl=wrcoef2('v',c,s,'bior3.7',1);
dl=wrcoef2('d',c,s,'bior3.7',1);
cl=[al,hl,vl,dl];  %显示分解后各频率成分的信息
subplot(122);
imshow(cl);
axis square;
axis on;
title('分解后低频和高频信息');


%% Example from book Part.2
clear;clc;
I1=imread("LenaRGB.tif");
I2=imread("BaboonRGB.tif");
I1=rgb2gray(I1);
I2=rgb2gray(I2);
I1=double(I1)/256;
I2=double(I2)/256;
XFUS=wfusimg(I1,I2,'sym4',5,'max','max'); %基于小波分解的图像融合
figure;
subplot(131);
imshow(I1);%colormap(jet); %设置色彩索引图
axis square;
axis on;
title("Image1")
subplot(132);
imshow(I2);%colormap(jet); %设置色彩索引图
axis square;
axis on;
title("Image2");
subplot(133);
imshow(XFUS);%colormap(jet); %设置色彩索引图
axis square; %用来产生正方形的坐标系
axis on;
title("融合后的图像");

实验效果:

【基于MATLAB的数字图像处理】第三章·基本图像变换_第17张图片

你可能感兴趣的:(基于MATLAB的数字图像处理,matlab,开发语言)