中国地质大学数字图像处理报告.docx
- 文档编号:15791430
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:43
- 大小:1.21MB
中国地质大学数字图像处理报告.docx
《中国地质大学数字图像处理报告.docx》由会员分享,可在线阅读,更多相关《中国地质大学数字图像处理报告.docx(43页珍藏版)》请在冰点文库上搜索。
中国地质大学数字图像处理报告
中国地质大学(武汉)
数字图像处理实习报告书
姓名:
专业:
班级:
学号:
指导老师:
第1题:
实验内容及目的:
根据灰度图象得到一副彩色图像(变换函数自定),分别显示1幅彩色图象的R,G,B分量(每个分量用8bit表示),和这幅彩色图象的H,S,I分量(每个分量也各用8bit表示)。
通过本题学会灰度图和彩色图之间的转换,了解RGB空间和HIS空间之间的关系。
实验原理:
图像由若干个像素点组成。
灰度图像矩阵的每个元素对应一个灰度值,伪彩色图像矩阵的每个元素对应R、G、B分量的值。
将一幅灰度图变为一幅彩色图相当于在灰度值与RGB分量之间建立函数关系。
HIS彩色空间由H(色调)、S(饱和度)、I(辉度)分量构成。
RGB分量和HIS分量的对应关系如下:
根据对应函数将RGB分量转化为HIS分量并显示,即可得到所需的HIS分量图。
思路分析:
用MATLAB处理图像首先要将灰度图像读入。
读入后将图像矩阵中的元素转化为uint8类型处理。
将灰度图变为彩色图就是在灰度值与R、G、B分量之间建立关系,所以要先生成R、G、B分量的矩阵,这就要知道原灰度图的大小(用size()函数实现)。
建立R、G、B分量的矩阵后,采用循环根据原图像的灰度值对其进行赋值。
最后用cat()函数合并三个分量得到生成的彩色图。
读入彩色图像并转为uint8类型,根据彩色图像的构成将R、G、B分量从图像矩阵中分量出来并显示。
显示图像的HIS分量时,首先将图像转化为double类型处理。
然后分离出RGB分量,根据RGB分量和HIS分量之间的转化关系得到HIS分量,此时的HIS分量时double类型,所以将这三个分量合并后转化为8bit类型。
将转化后的矩阵再分离出HIS分量即可得到8bit类型的HIS分量图。
代码:
clearall;
closeall;
X=imread('fudiao.jpg');%读入图像
subplot(121);
imshow(X);title('灰度图像');%显示原始图像
X=im2uint8(X);%将图像转化为int8类型
[M,N]=size(X);%求得矩阵的维度
%生成RGB矩阵
R=zeros(M,N);
G=zeros(M,N);
B=zeros(M,N);
%建立灰度值与RGB分量之间的变换关系
forp=1:
M
fork=1:
N
if(X(p,k)<128)
R(p,k)=128;
elseif(X(p,k)<192)
R(p,k)=4*X(p,k)-511;
else
R(p,k)=255;
end
if(X(p,k)<64)
B(p,k)=255;
elseif(X(p,k)<128)
B(p,k)=511-4*X(p,k);
else
B(p,k)=0;
end
if(X(p,k)<64)
G(p,k)=4*X(p,k);
elseif(X(p,k)<192)
G(p,k)=255;
else
G(p,k)=1023-4*X(p,k);
end
end
end
Z=cat(3,R,G,B);%合并三个分量
Subplot(122);
imshow(Z);%显示伪彩色图
title('伪彩色图像');
%%%%%%%%%%%%%
%显示一幅图的RGB分量和HIS分量
clearall;
closeall;
X=imread('tower.jpg');
X=im2uint8(X);%将图像转化为int8类型
figure
(1);
title('原始图像');%显示原始图像
imshow(X);
XR=X(:
:
1);%分离出RGB分量
XG=X(:
:
2);
XB=X(:
:
3);
figure
(2);
subplot(2,3,1);
imshow(XR);
%显示RGB分量图
title('R分量');
subplot(2,3,2);
imshow(XG);
title('G分量');
subplot(2,3,3);
imshow(XB);
title('B分量');
%HSI分量
X=im2double(X);
XR=X(:
:
1);
XG=X(:
:
2);
XB=X(:
:
3);
%根据RGB分量和HIS分量间的变换关系求得HIS分量
num=0.5*((XR-XG)+(XR-XB));
den=sqrt((XR-XG).^2+(XR-XB).*(XG-XB));
theta=acos(num./(den+eps));
if(XG>=XB)
H=theta;
else
H=2*pi-theta;
end
I=(XR+XG+XB)./3;
num=min(min(XR,XG),XB);
den=XR+XG+XB;
den(den==0)=eps;
S=1-3.*num./den;
M=cat(3,H,S,I);%合并三个分量
M=im2uint8(M);%将图像转化为8bit类型
%分离HIS分量
H=M(:
:
1);
S=M(:
:
2);
I=M(:
:
3);
subplot(2,3,4);
imshow(log(H)+1,[]);
%显示HIS分量图
title('H分量');
subplot(2,3,5);
imshow(S);
title('S分量');
subplot(2,3,6);
imshow(I);
title('I分量');
调试:
第2题:
实验内容及目的:
编程实现图像傅立叶变换,并且显示图像的频谱图,编程实现傅里叶变换的,分离性,平移,旋转,卷积性质。
通过本题了解图像傅立叶变换的性质和作用。
实验原理:
离散傅立叶变换是将图像从时域转化到频域的一种方法。
二维离散傅立叶变换的公式如下:
由它的定义式可以看出二维离散傅立叶变换具有可分离性。
F(u,v)=xyf(x,y)exp[-j2(ux/M+vy/N)]
=x{yf(x,y)exp[-j2vy/N]}exp[-j2ux/M]
=xF(x,v)exp[-j2ux/M]
其中F(x,v)=yf(x,y)exp(-j2vy/N)。
根据上式推出,计算一幅图像的二维傅里叶变换可以先计算行变换再计算列变换。
由定义式可推出:
f(x,y)exp[j2(u0x+v0y)/N]F(u-u0,v-v0)
f(x-x0,y-y0)F(u,v)exp[-j2(ux0+vy0)/N]
证明傅立叶变换的平移性可以将图像矩阵与一指数相乘再对其进行傅里叶变换,观察结果是否是将原图像的傅立叶变换移动到新的位置。
对f(x,y)的平移不影响其傅里叶变换的幅值。
傅里叶变换具有旋转性,即时域图旋转某一角度后,其傅里叶变换也旋转同样的角度。
傅里叶变换的卷积性:
如果f(x,y)F(u,v),g(x,y)G(u,v)
则f(x,y)*g(x,y)F(u,v)G(u,v)
思路分析:
读入所要处理的图像,用fft2函数对其进行傅立叶变换,显示变换后的频谱图以及幅度谱。
验证傅立叶变换的可分离性。
先对图像做一次一维傅里叶变换,对得到的结果再进行一次一维傅立叶变换,得到的结果与图像的二维傅立叶变换比较。
验证傅立叶变换的平移性。
先给图像补零以便于后面平移。
我在图像的右侧补32列0。
将图像右移16列,对其进行傅立叶变换并与变换前的幅度谱进行对比。
验证傅立叶变换的旋转性。
将时域图旋转90度后进行傅立叶变换,得到的结果与旋转前的幅度谱比较。
验证傅立叶变换的卷积性。
由于图像太大,所以我自己产生了一个64×64的黑白图,用conv2函数让这个黑白图与自身做卷积,得到的结果再做傅立叶变换,画出得到的频谱图。
将这个黑白图补零成128×128的图,对其进行傅立叶变换,再把得到的结果与自身相乘,画出得到的频谱图。
比较卷积的傅立叶变换频谱图和傅立叶变换的乘积的频谱图。
代码:
clearall;
clc;
I=imread('girl.bmp');%读入图像
I=im2double(I);
Ifft=fft2(I);%对图像做离散傅里叶变换
figure
(1);
imshow(I);
title('原始图像');%显示原始图像
figure
(2);
subplot(121);
imshow(Ifft);
title('频谱图');%显示离散傅立叶变换后的频谱图
subplot(122);
Ifft=fftshift(Ifft);
imshow(log(abs(Ifft)+1),[]);
title('幅度谱');%显示变换后的幅度谱
%可分离性
Ifft=fft(fft(I).').';
figure(3);
subplot(221);
imshow(Ifft);
title('进行两次一维变换后的频谱图');
subplot(222);
Ifft=fftshift(Ifft);
imshow(log(abs(Ifft)+1),[]);
title('进行两次一维变换后的幅度谱');
Ifft=fft2(I);
subplot(223);
imshow(Ifft);
title('二维傅立叶变换后的频谱图');
subplot(224);
Ifft=fftshift(Ifft);
imshow(log(abs(Ifft)+1),[]);
title('二维傅立叶变换后的幅度谱');
%平移性
[MN]=size(I);
A=zeros(M,32);
I2=[IA];
figure(5);
subplot(221);
imshow(I2);title('原始图');
I2=fft2(I2);
fft_I2=fftshift(I2);
subplot(222);
imshow(log(abs(fft_I2)+1),[]);title('原幅度谱');
B=zeros(M,16);
I3=[BIB];
subplot(223);
imshow(I3);title('平移后的图');
I3=fft2(I3);
fft_I3=fftshift(I3);
subplot(224);
imshow(log(abs(fft_I3)+1),[]);title('平移后的幅度谱');
%旋转性
X=imrotate(I,90);
figure(6);
imshow(X);
title('旋转90度后的图像');
Ifft=fft2(X);
Ifft=fftshift(Ifft);
figure(7);
imshow(log(abs(Ifft)+1),[]);
title('旋转90度后的幅度谱');
%卷积性
C=zeros(64,64);%生成图像矩阵
C(25:
45,25:
45)=1;%给25行到45行,25列到45列的值赋1
C_OUT=conv2(C,C);%C和C做卷积
CFFT=fft2(C_OUT);%对生成的卷积做傅立叶变换
figure(8);
subplot(121);
imshow(CFFT);%显示卷积的傅立叶变换
title('卷积的傅立叶变换');
%给图像矩阵补零
D=zeros(128,128);%生成128×128的零矩阵
D(1:
64,1:
64)=C;%零矩阵的左上角放置图像矩阵
Dfft=fft2(D);%对补零后的图像做傅立叶变换
DFFT2=Dfft.*Dfft;
subplot(122);
imshow(DFFT2);%显示傅立叶变换的乘积
title('傅立叶变换的乘积');
figure(9);subplot(121);
imshow(C_OUT);title('卷积的时域图');
subplot(122);
imshow(ifft2(DFFT2));title('傅里叶变换乘积的时域图');
第3题:
实验内容及目的:
用直接灰度变换改变图像(求反,增强对比度,动态范围压缩,灰度切分),显示一副灰度图像的8个位面图。
实验原理:
对图像求反就是将图像的灰度值翻转,变换前的灰度值与变换后的灰度值的关系如下:
增强图像对比度实际是增强原图各部分之间的反差(灰度差别)。
若变换前的灰度值与变换后的灰度值满足以下关系:
灰度值在f1到f2之间的动态范围增加,在这个范围内的对比度增强。
图像的动态范围压缩与增强对比度相反,例如:
f2
f1
图中f1到f2内的动态范围明显减少。
灰度切分与增强对比度类似,在关心的范围取较高的值。
图像是由很多个像素点组成,每个像素点有一个灰度值。
若一幅图像的灰度级是256,则该幅图的每个灰度值均可用一个八位的二进制数表示。
将这些二进制数的第0位抽取出来就可以构成第0号平面,第1位抽取出来就可以构成第1号平面,以此类推,可将这幅图用8个位面图表示。
思路分析:
读入图像并将其转化为double类型。
用size()函数求得图像矩阵的大小[MN],生成一个M×N的零矩阵Z1,利用函数y=-x+1建立Z1与图像矩阵之间的关系,将图像取反。
同理利用下列函数关系建立输出矩阵与原图像之间的映射,分别实现图像的增强对比度,动态范围压缩和灰度切分。
(f1=0.3,g1=0.1,f2=0.6,g2=0.8)
(g=lg(f+1))
(f1=0.3,g1=0.3,f2=0.6,g2=0.6)
要显示一幅图像的八个位面图,首先读入图像并用size函数求得它的大小,用dec2bin()函数将图像矩阵中的元素转化为二进制数,提取每个八位二进制数的第N位,用reshape()函数将提取出的值转化为跟原图像大小相同的矩阵。
N=0到7,处理后的矩阵分别对应位面图的0到7平面。
代码:
I=imread('girl.bmp');
I=im2double(I);
[MN]=size(I);
%求反
Z1=zeros(M,N);
fori=1:
M
forj=1:
N
Z1(i,j)=-I(i,j)+1;
end
end
figure
(1);
subplot(121);
imshow(I);title('原图');
subplot(122);
imshow(Z1);title('求反');
%增强对比度
Z2=zeros(M,N);
fori=1:
M
forj=1:
N
ifI(i,j)<=0.3
Z2(i,j)=1/3*I(i,j);
elseifI(i,j)<=0.6
Z2(i,j)=7/3*I(i,j)-0.6;
elseZ2(i,j)=1/2*I(i,j)+1/2;
end
end
end
end
figure
(2);
subplot(121);
imshow(Z2);title('增强对比度');
%动态范围压缩
Z3=zeros(M,N);
fori=1:
M
forj=1:
N
Z3(i,j)=log10(I(i,j)+1);
end
end
subplot(122);
imshow(Z3);title('动态范围压缩');
%灰度切分
Z4=zeros(M,N);
fori=1:
M
forj=1:
N
ifI(i,j)<0.3
Z4(i,j)=I(i,j);
elseifI(i,j)<=0.6
Z4(i,j)=0.6;
elseZ4(i,j)=I(i,j);
end
end
end
end
figure(3);
imshow(Z4);title('灰度切分');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X=imread('girl.bmp');%读入图像
[p,k]=size(X);%求得矩阵维度
Z=dec2bin(X);%将矩阵元素转化为二进制数
%将一维数组转化为p×k的二维矩阵
%n到n7分别对应0平面到7平面的图
m0=reshape(Z(:
8),p,k);
n0=1.*m0;
m1=reshape(Z(:
7),p,k);
n1=2.*m1;
m2=reshape(Z(:
6),p,k);
n2=4.*m2;
m3=reshape(Z(:
5),p,k);
n3=8.*m3;
m4=reshape(Z(:
4),p,k);
n4=16.*m4;
m5=reshape(Z(:
3),p,k);
n5=32.*m5;
m6=reshape(Z(:
2),p,k);
n6=64.*m6;
m7=reshape(Z(:
1),p,k);
n7=128.*m7;
%显示各个位面图
figure
(1);
subplot(121);
imshow(n0,[]);
subplot(122);
imshow(n1,[]);
figure
(2);
subplot(121);
imshow(n2,[]);
subplot(122);
imshow(n3,[]);
figure(3);
subplot(121);
imshow(n4,[]);
subplot(122);
imshow(n5,[]);
figure(4);
subplot(121);
imshow(n6,[]);
subplot(122);
imshow(n7,[]);
调试:
第4题:
实验内容及目的:
编写一副灰度图像的DCT变换,walsh变换,以及小波变换的结果,分别显示原始图像与变换后的图像。
实验原理:
离散傅立叶变换在边界容易产生块效应,离散余弦变换DCT的思想通过对信号的边界进行对称后周期延拓再傅里叶变换,减少了边界效应。
二维DCT正变换核表达式:
二维DCT变换对:
哈达玛矩阵的每一行或每一列都是一正交码组,沃尔什矩阵将哈达玛矩阵中行的次序按+1和-1交变次数的多少重新排列。
沃尔什变换对:
二维离散小波变换分为二维离散小波分解和二维离散小波重构。
二维离散小波分解是将图像分解成低频图像与对角细节图像,二维离散小波重构则是基于分解的结果得到原始图像。
二维离散小波的快速算法通过一组低通滤波器和高通滤波器,对行、列分别进行滤波实现。
常用的Haar小波变换:
思路分析:
离散余弦变换可以用dct2()函数实现,沃尔什变换我写了一个dht2()函数实现。
在dht2函数中,首先将输入的图像转化为double类型。
求得输入图像的大小,便于产生与其大小相等的哈达玛矩阵。
进行沃尔什变换要用到沃尔什矩阵。
由沃尔什矩阵与哈达玛矩阵的关系将哈达玛矩阵排序成沃尔什矩阵。
设置一个num列向量来记录哈达玛矩阵每行正交变换次数,然后根据该列向量得到沃尔什矩阵,最后用变换公式得到变换后的图像。
小波变换直接调用dwt2()函数即可。
代码:
clearall;
closeall;
I=imread('girl.bmp');%读入图像
Q=im2double(I);%将图像转化为double类型
figure
(1);
subplot(121);
imshow(I);%显示原始图像
title('原始图像');
Idct=dct2(Q);%对图像做离散余弦变换
subplot(122);
imshow(Idct);%显示变换后的图像
title('离散余弦变换后的频谱图');
Idht=dht2(Q);%对图像做离散沃尔什变换
figure
(2);
imshow(Idht);%显示沃尔什变换的频谱图
title('离散沃尔什变换后的频谱图');
[A,H,V,D]=dwt2(Q,'haar');%Haar小波变换
AHVD=[AH;VD];%小波分解图像矩阵
figure(3);subplot(121);
imshow(AHVD,[]);%显示分解图像
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
functionZ=dht2(X)
%函数输入:
%X:
输入图像(N,N)的矩阵,N为2的整数次幂,数据类型为double
%函数输出:
%Z:
输出的频域图像矩阵,大小为(N,N),数据类型为double
%函数描述
%函数将输入的矩阵进行二维DHT变换
[NM]=size(X);%求得图像大小
H=hadamard(N);%生成N×N的哈达玛矩阵
A=H*X*H/N/N;%对图像进行哈达玛变换
%将得到的矩阵行的次序按正负交变次数排序,完成沃尔什变换
W=zeros(N);
num=zeros(N,1);%记录每行正负交变次数
form=1:
N
fork=1:
N-1
if(A(m,k)*A(m,k+1)==-1)%判断数据是否发生正负交变
num(m)=num(m)+1;
end
end
end
forp=N:
1
W(p,:
)=A(find(num==max(num)),:
);%根据累计矩阵的值排序
num(find(num==max(num)))=-1;
end
Z=W;
end
调试:
纠错后:
functionZ=dht2(X)
%函数输入:
%X:
输入图像(N,N)矩阵,N为2的整数次幂数据类型为double
%函数输出:
%Z:
输出的频域图像矩阵,尺寸为(N,N),数据类型为double
%函数描述:
%函数将输入的矩阵进行二维DHT变换
X=im2double(X);%将图像转化为double类型
[NM]=size(X);%求得图像大小
H=hadamard(N);%生成N×N的哈达玛矩阵
W=zeros(N);%生成N×N的零矩阵
num=zeros(N,1);%记录哈达玛矩阵每一行正交变换次数
form=1:
N
fork=1:
N-1
if(H(m,k)*H(m,k+1)==-1)
num(m)=num(m)+1;
end
end
end
%根据记录矩阵的值对哈达玛矩阵进行排序
forp=1:
N
W(p,:
)=H(find(num==max(num)),:
);
num(find(num==max(num)))=-1;
end
W=flipud(W);%矩阵上下颠倒
Z=W*X*W/N;
end
结果:
第5题:
实验内容及目的:
编程实现均值,中值,最大值滤波,编程实现各个高通滤波的各种算子的边缘检测
实验原理:
中值滤波将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
中值滤波器是一种非线性平滑滤波器,既可消除噪声又可保持图象的细节。
它的工作步骤如下:
(1)将模板在图中漫游,并将模板中心与图中某个象素位置重合;
(2)读取模板下各对应象素的灰度值;
(3)将这些灰度值从小到大排成1列;
(4)找出这些值里排在中间的1个;
(5)将这个中间值赋给对应模板中心位置的象素。
均值滤波:
用像素领域内的均值代替
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国地质大学 数字图像 处理 报告