数字图像处理-DFT&DCT&WHT&小波变换分解重构(Matlab)

数字图像处理-DFT&DCT&WHT&小波变换分解重构(Matlab)

基本的matlab图像处理函数的使用

函数功能
imread('图像名')读取图像
imshow(color_pic)显示图像
rgb2gray(color_pic)将彩色图像转换成灰度图像
imhist(gray_pic,n)查看灰度图像的灰度直方图

代码块

%-----------------Matlab基本图像处理函数使用------------------
clear ;
close all;
color_pic=imread('lena512color.bmp');  %读取图像
figure('name','图像读取');   
subplot(2,2,1);
imshow(color_pic);   %显示图像
title('原彩色图像');
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
subplot(2,2,2);
imshow(gray_pic);
title('灰度图像');
subplot(2,2,3);
imhist(gray_pic);   %查看灰度直方图,默认n=256,256个长度为1的灰度空间
title('灰度直方图256等级');
subplot(2,2,4);
imhist(gray_pic,64);%n=6464个长度为4的灰度空间
title('灰度直方图64等级');

运行效果

在这里插入图片描述

傅里叶变换(DFT)

对图像进行傅里叶正变换

%------------------傅里叶变换------------------
clear;  %清除变量
close all; %关闭生成的画图窗口
color_pic=imread('lena512color.bmp');  %读取图像
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
figure('name','傅里叶变换'); %傅里叶变换
subplot(2,2,1);
imshow(gray_pic);
title('原灰度图像');
Fourier=fft2(gray_pic);  %对灰度图像进行傅里叶正变换
log_Fourier=log(abs(Fourier)+1); %取模并进行缩放,调高频谱图像的低灰度值而对高灰度值仅可能减小
subplot(2,2,2);
imshow(log_Fourier,[]);    %未进行频谱搬移时的频谱图
title('傅里叶变换频谱图');
Fourier_shift=fftshift(Fourier); %将频谱图中零频率成分移动至频谱图中心
log_Fourier_shift=log(abs(Fourier_shift)+1); %取模并进行缩放,对于(01)之间的x值经过取对数后会变成负值,而log(x+1)则将所有的x值映射到正数范围内
subplot(2,2,3);
imshow(log_Fourier_shift,[]);
title('频移后的频谱图');
  • 程序运行效果:

在这里插入图片描述

  • 总结:
     在图像的傅里叶频谱中,原空间域图像上的灰度突变部位、图像结构复杂的区域、图像细节及干扰噪声等信息集中在高频区,原空间域图像上灰度变化平缓部位的信息(图像轮廓)集中在低频区。
     低频部分(图像轮廓)对应于未进行频移的傅里叶频谱的4个边角角部分,由于低频部分能量较集中,因而在频谱图上的视觉效果较亮。当进行频移后,低频部分移至频谱中央,中央处最亮。

去除部分高频分量后对图像进行傅里叶逆变换

%-----------------设置阈值滤除高频  傅里叶逆变换----------------
clear;
close all;
color_pic=imread('lena512color.bmp');  %读取图像
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
threshold=[100000,30000,5000,500];  %设置不同阈值 (高频部分能量低)
figure('name','傅里叶逆变换图像');
for i=1:4
    Fourier=fft2(gray_pic);  %对灰度图像进行傅里叶正变换
    Fourier_shift=fftshift(Fourier); %将频谱图中零频率成分移动至频谱图中心
    h_Fourier_shift=abs(Fourier_shift);% 取傅里叶变换后幅度模值,使灰度值为正数
    Fourier_shift(h_Fourier_shift<threshold(i))=0;  %取阈值消除部分高频
    IFourier=real(ifft2(ifftshift(Fourier_shift)));  %傅里叶逆变换,要记得先把频移的频谱频移回去
    ret=uint8(IFourier); %将灰度级映射到0-255上
    subplot(2,2,i);
    imshow(ret);
    str=num2str(threshold(i));
    title(['阈值:',str]);
end
  • 程序运行效果:

在这里插入图片描述

  • 总结:
     因为高频部分能量较低,即傅里叶变换后的高频部分幅度值较低,当设置的阈值越小时,保留了更多低频部分,即轮廓部分保留下来,图像也就恢复的越接近原图。

离散余弦变换(DCT)

对图像进行DCT正变换

%----------------DCT变换------------------
clear;
close all;
color_pic=imread('lena512color.bmp');  %读取图像
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
figure('name','DCT变换'); 
DCT=dct2(gray_pic);  %DCT变换
h_DCT=abs(DCT);  %DCT变换后的幅度
log_DCT=log(h_DCT);   %取模并进行缩放,调高频谱图像的低灰度值而对高灰度值仅可能减小
imshow(log_DCT,[]);
title('DCT变换');
colormap(gray(4));  %重新设置灰度级为4,便于查看DCT变换后的频谱图特点
colorbar;   %显示颜色栏
  • 程序运行效果:

在这里插入图片描述

  • 总结:
      从DCT频谱图易看出,低频部分(图像轮廓)能量集中在左上角,因此可进行图像压缩。

去除部分高频分量后对图像进行DCT逆变换

%----------------取阈值去除高频分量 DCT逆变换------------------
clear;
close all;
color_pic=imread('lena512color.bmp');  %读取图像
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
threshold=[200,100,10,1];  %设置不同阈值 (高频部分能量低)
for i=1:4
    DCT=dct2(gray_pic); %DCT正变换
    h_DCT=abs(DCT);  %DCT变换后的幅度
    DCT(h_DCT<threshold(i))=0;  %DCT变换后取模得出的幅度值若小于20则至0
    IDCT=uint8(idct2(DCT));  %对图像进行DCT逆变换,并将灰度级映射到0-255上
    subplot(2,2,i);
    imshow(IDCT);
    str=num2str(threshold(i));
    title(['阈值:',str]);
end
  • 程序运行效果:

在这里插入图片描述

  • 总结:
     因为高频部分能量较低,即DCT变换后的高频部分幅度值较低,当设置的阈值越小时,保留了更多低频部分,即轮廓部分保留下来,图像也就恢复的越接近原图。

沃尔什哈达玛变换(WHT)

对图像进行WHT正变换

%------------------沃尔什哈达玛变换------------------
clear;
close all;
color_pic=imread('lena512color.bmp');  %读取图像
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
figure('name','沃尔什哈达玛'); 
subplot(2,2,1);
imshow(gray_pic);
title('原灰度图像');    %imread读入源图像为三维,所以不能进行D=A*X*A
im2double_gray_pic=im2double(gray_pic);%必须对读取的图像做I=im2double(I),函数im2double 将其值归一化到01之间
Hada=hadamard(512); %生成512x512哈达玛矩阵
Hada_pic=Hada*(im2double_gray_pic)*Hada;
Hada_pic2=Hada_pic/512;  %沃尔什哈达玛变换记得/(N*N=512*512),此处只除512是为了频谱图效果好看
subplot(2,2,2);
imshow(Hada_pic2);
title('沃尔什哈达玛变换');
  • 程序运行效果:

在这里插入图片描述

去除部分高频分量后对图像进行WHT逆变换

%----------------取阈值去除高频分量 沃尔什哈达玛逆变换------------------
clear;
close all;
color_pic=imread('lena512color.bmp');  %读取图像
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
im2double_gray_pic=im2double(gray_pic);%必须对读取的图像做I=im2double(I),函数im2double 将其值归一化到01之间
Hada=hadamard(512);%生成512x512哈达玛矩阵
Hada_pic=Hada*(im2double_gray_pic)*Hada;
threshold=[0.5,0.3,0.2,0.1];  %设置不同阈值 (高频部分能量低)
for i=1:4
    Hada_pic2=Hada_pic/(512);  %沃尔什哈达玛变换记得/(N*N=512*512),此处只除512是为了频谱图效果好看
    h_Hada=abs(Hada_pic2);
    Hada_pic2(h_Hada<threshold(i))=0; %取阈值消除部分高频
    IHada_pic=Hada'*Hada_pic2*Hada';% Hada'是Hada的转置矩阵
    IHada_pic2=im2uint8(IHada_pic/512); %将灰度级转换为255级,否则灰度值大于255,图像太亮,呈现一片白
    subplot(2,2,i);
    imshow(IHada_pic2);
    str=num2str(threshold(i));
    title(['阈值:',str]);
end;
  • 程序运行效果:

在这里插入图片描述

  • 总结:
     因为高频部分能量较低,即WHT变换后的高频部分幅度值较低,当设置的阈值越小时,保留了更多低频部分,即轮廓部分保留下来,图像也就恢复的越接近原图。

小波分解重构

一级小波分解

%-------------------小波变换一级分解,小波基函数选db4-----------------------
clear;
close all;
color_pic=imread('lena512color.bmp');  %读取图像
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
figure('name','小波变换一级分解');
[c,s]=wavedec2(gray_pic,1,'db4'); %小波一级分解,小波基函数采用db4
ca1=appcoef2(c,s,'db4',1);   %低频分量
ch1=detcoef2('h',c,s,1);     %高频水平分量
cv1=detcoef2('v',c,s,1);     %高频垂直分量
cd1=detcoef2('d',c,s,1);     %高频对角分量
subplot(2,2,1);imshow(ca1,[]);title('LL1');
subplot(2,2,2);imshow(ch1,[]);title('HL1');
subplot(2,2,3);imshow(cv1,[]);title('LH1');
subplot(2,2,4);imshow(cd1,[]);title('HH1');
  • 程序运行效果:

在这里插入图片描述

一级小波重构

%-------------------小波变换一级重构,小波基函数选db4-----------------------
clear;
close all;
color_pic=imread('lena512color.bmp');  %读取图像
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
figure('name','小波变换一级重构');
[c,s]=wavedec2(gray_pic,1,'db4'); %小波一级分解,小波基函数采用db4
re_ca1=wrcoef2('a',c,s,'db4',1); %重建第一层低频分量系数
re_ch1=wrcoef2('h',c,s,'db4',1); %重建第一层高频水平分量系数
re_cv1=wrcoef2('v',c,s,'db4',1); %重建第一层高频垂直分量系数
re_cd1=wrcoef2('d',c,s,'db4',1); %重建第一层高频对角分量系数
re_set1=[re_ca1,re_ch1;re_cv1,re_cd1];  %将各个分量图像拼接在一张图像
subplot(1,2,1);imshow(re_set1,[]);title('第一层小波系数的重构');
re_img1=re_ca1+re_ch1+re_cv1+re_cd1;%将各个分量合并复原
subplot(1,2,2);imshow(re_img1,[]);title('一级重构图像');
  • 程序运行效果:

在这里插入图片描述

二级小波分解

%-------------------小波变换二级分解,小波基函数选db4)-----------------------
clear;
close all;
color_pic=imread('lena512color.bmp');  %读取图像
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
figure('name','小波变换二级分解');
[c,s]=wavedec2(gray_pic,2,'db4'); %小波二级分解
%小波一级分解分量
ca1=appcoef2(c,s,'db4',1);   %低频分量
ch1=detcoef2('h',c,s,1);     %高频水平分量
cv1=detcoef2('v',c,s,1);     %高频垂直分量
cd1=detcoef2('d',c,s,1);     %高频对角分量
%显示第1级分解各分量
subplot(4,4,[3,4,7,8]);imshow(ch1,[]);title('HL1');
subplot(4,4,[9,10,13,14]);imshow(cv1,[]);title('LH1');
subplot(4,4,[11,12,15,16]);imshow(cd1,[]);title('HH1');
%提取第2层的各分量
ca2=appcoef2(c,s,'db4',2);   %低频分量
ch2=detcoef2('h',c,s,2);     %高频水平分量
cv2=detcoef2('v',c,s,2);     %高频垂直分量
cd2=detcoef2('d',c,s,2);     %高频对角分量
%显示第2级分解各分量
subplot(4,4,1);imshow(ca2,[]);title('LL2');
subplot(4,4,2);imshow(ch2,[]);title('HL2');
subplot(4,4,5);imshow(cv2,[]);title('LH2');
subplot(4,4,6);imshow(cd2,[]);title('HH2');
  • 程序运行效果:

在这里插入图片描述

二级小波重构

%-------------------小波变换2级重构,小波基函数选db4-----------------------
clear;
close all;
color_pic=imread('lena512color.bmp');  %读取图像
gray_pic=rgb2gray(color_pic);  %将彩色图转换成灰度图
figure('name','小波变换二级重构');
[c,s]=wavedec2(gray_pic,2,'db4'); %小波二级分解
re_ca2=wrcoef2('a',c,s,'db4',2);  %重建第二层低频分量系数
re_ch2=wrcoef2('h',c,s,'db4',2);  %重建第二层高频水平分量系数
re_cv2=wrcoef2('v',c,s,'db4',2);  %重建第二层高频垂直分量系数
re_cd2=wrcoef2('d',c,s,'db4',2);  %重建第二层高频对角分量系数
re_set2=[re_ca2,re_ch2;re_cv2,re_cd2]; %将各个分量图像拼接在一张图像
subplot(1,2,1);imshow(re_set2,[]);title('第二层小波系数的重构');
re_img2=re_ca2+re_ch2+re_cv2+re_cd2; %将各个分量合并复原
subplot(1,2,2);imshow(re_img2,[]);title('二级重构图像');
  • 程序运行效果:

在这里插入图片描述

  • 136
    点赞
  • 773
    收藏
    觉得还不错? 一键收藏
  • 39
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值