数字图像处理-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=64,64个长度为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); %取模并进行缩放,对于(0,1)之间的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 将其值归一化到0~1之间
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 将其值归一化到0~1之间
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('二级重构图像');
- 程序运行效果:
转载:https://blog.csdn.net/qq_23023937/article/details/109158715
查看评论