实验三 空域图像增强.docx
《实验三 空域图像增强.docx》由会员分享,可在线阅读,更多相关《实验三 空域图像增强.docx(21页珍藏版)》请在冰豆网上搜索。
实验三空域图像增强
实验三空域图像增强(灰度变换、直方图处理)
一、实验目的
1.掌握灰度变换的基本原理。
2.掌握直方图处理的基本原理。
3.掌握Matlab中灰度变换和直方图处理的实现方法。
二、实验内容
1.灰度变换(直接正比变换)。
2.灰度变换(截取式正比变换)。
3.灰度变换(反比变换)。
4.灰度变换(对比拉伸)。
5.灰度变换(灰度切割)。
6.灰度变换(对数变换)。
7.灰度变换(幂次变换)。
8.直方图处理(直方图均衡化)。
三、实验仪器、设备及材料
1.电脑一台(2GCPU、2GBRAM、50GBDisk及以上)。
2.Windows2000/WindowsXP/Windows7。
3.MatlabR2006b及以上版本。
4.记录用的笔、纸。
四、实验原理
1.灰度变换
灰度变换是一种点操作,根据原始图像中每个像素的灰度值,按照某种映射规则将其转化为另一灰度值。
其原理是将原图像f(x,y)中的每个像素的灰度按EH操作直接变换以得到目标图像g(x,y)。
若以s表示f(x,y),以t表示g(x,y),则灰度变换原理如下图所示:
2.直方图处理
直方图变换可以清晰图像细节,突出目标物体,改善亮度比例关系,增强图像对比度。
直方图变换基于概率论。
直方图均衡化主要用于增强动态范围偏小的图像的反差。
其基本思想是把原图像的直方图转换为均匀分布的形式,增加像素灰度值的动态范围,增强图像整体对比度。
五、实验步骤
1.灰度变换(直接正比变换)
(1)程序源代码:
closeall
clear15
clc
disp('====E4_4_1.m====');
I=imread('rice.png');
subplot(3,3,1),imshow(I),ylabel('原图像');
subplot(3,3,2),imhist(I);
%方法1-系统函数
J=imadjust(I,[40/255204/255],[01]);%图像的最小灰度值为40,最大灰度值为204
subplot(3,3,4),imshow(J),ylabel('变换图像(方法1)');
subplot(3,3,5),imhist(J);
%方法2-编程实现
%把灰度值范围从[40,204]映射到[0,255]
f0=0;g0=0;%分段曲线的第1个点
f1=40;g1=0;%分段曲线的第2个点
f2=204;g2=255;%分段曲线的第3个点
f3=255;g3=255;%分段曲线的第4个点
subplot(3,3,9),plot([f0,f1,f2,f3],[g0,g1,g2,g3]),xlabel('f'),ylabel('g'),axis([02550255]);
%绘制变换曲线
r1=(g1-g0)/(f1-f0);%曲线1的斜率
b1=g0-r1*f0;%曲线1的截距
r2=(g2-g1)/(f2-f1);%曲线2的斜率
b2=g1-r2*f1;%曲线2的截距
r3=(g3-g2)/(f3-f2);%曲线3的斜率
b3=g2-r3*f2;%曲线3的截距
[m,n]=size(I);
K=double(I);
fori=1:
m
forj=1:
n
f=K(i,j);
g(i,j)=0;
if(f>=f0)&(f<=f1)
g(i,j)=r1*f+b1;%曲线1的方程y=r1*x+b1
else
if(f>=f1)&(f<=f2)
g(i,j)=r2*f+b2;%曲线2的方程y=r2*x+b2
else
if(f>=f2)&(f<=f3)
g(i,j)=r3*f+b3;%曲线3的方程y=r3*x+b3
end
end
end
end
end16
subplot(3,3,7),imshow(uint8(g)),ylabel('变换图像(方法2)');
subplot(3,3,8),imhist(uint8(g));
(2)观察并记录实验结果:
作为实验报告的内容
(3)将“分段曲线的第2个点”更改为“f1=150;g1=0;”,观察并记录实验结果,分析产生该结果的原因:
作为实验报告的内容。
2.灰度变换(截取式正比变换)
(1)程序源代码:
closeall
clear
clc
disp('====E4_4_2.m====');
I=imread('rice.png');
subplot(3,3,1),imshow(I),ylabel('原图像');
subplot(3,3,2),imhist(I);
%方法1-系统函数
%把灰度值范围[80,160]映射到[20,220],灰度值小于80的映射为20,灰度值大于160的映射为220
J=imadjust(I,[80/255160/255],[20/255220/255]);
subplot(3,3,4),imshow(J),ylabel('变换图像(方法1)');
subplot(3,3,5),imhist(J);
%方法2-编程实现
%把灰度值范围[80,160]映射到[20,220],灰度值小于80的映射为20,灰度值大于160的映射为220
f0=0;g0=20;%分段曲线的第1个点
f1=80;g1=20;%分段曲线的第2个点
f2=160;g2=220;%分段曲线的第3个点
f3=255;g3=220;%分段曲线的第4个点
subplot(3,3,9),plot([f0,f1,f2,f3],[g0,g1,g2,g3]),xlabel('f'),ylabel('g'),axis([02550255]);
%绘制变换曲线
r1=(g1-g0)/(f1-f0);%曲线1的斜率
b1=g0-r1*f0;%曲线1的截距
r2=(g2-g1)/(f2-f1);%曲线2的斜率
b2=g1-r2*f1;%曲线2的截距
r3=(g3-g2)/(f3-f2);%曲线3的斜率
b3=g2-r3*f2;%曲线3的截距
[m,n]=size(I);
K=double(I);
fori=1:
m
forj=1:
n
f=K(i,j);
g(i,j)=0;17
if(f>=f0)&(f<=f1)
g(i,j)=r1*f+b1;%曲线1的方程y=r1*x+b1
else
if(f>=f1)&(f<=f2)
g(i,j)=r2*f+b2;%曲线2的方程y=r2*x+b2
else
if(f>=f2)&(f<=f3)
g(i,j)=r3*f+b3;%曲线3的方程y=r3*x+b3
end
end
end
end
end
subplot(3,3,7),imshow(uint8(g)),ylabel('变换图像(方法2)');
subplot(3,3,8),imhist(uint8(g));
(2)观察并记录实验结果:
作为实验报告的内容。
(3)将“分段曲线的第1个点”更改为“f1=0;g1=150;”,“分段曲线的第2个点”更改为“f1=80;g1=150;”,观察并记录实验结果,分析产生该结果的原因:
作为实验报告的内容。
3.灰度变换(反比变换)
(1)程序源代码:
closeall
clear
clc
disp('====E4_4_3.m====');
I=imread('rice.png');
subplot(3,3,1),imshow(I),ylabel('原图像');
subplot(3,3,2),imhist(I);
%方法1-系统函数
%把灰度值范围[0,255]映射到[255,0]
J=imadjust(I,[0/255255/255],[255/2550/255]);
subplot(3,3,4),imshow(J),ylabel('变换图像(方法1)');
subplot(3,3,5),imhist(J);
%方法2-编程实现
%把灰度值范围[0,255]映射到[255,0]
f0=0;g0=255;%分段曲线的第1个点
f1=100;g1=155;%分段曲线的第2个点
f2=200;g2=55;%分段曲线的第3个点
f3=255;g3=0;%分段曲线的第4个点
subplot(3,3,9),plot([f0,f1,f2,f3],[g0,g1,g2,g3]),xlabel('f'),ylabel('g'),axis([02550255]);
%绘制变换曲线
r1=(g1-g0)/(f1-f0);%曲线1的斜率18
b1=g0-r1*f0;%曲线1的截距
r2=(g2-g1)/(f2-f1);%曲线2的斜率
b2=g1-r2*f1;%曲线2的截距
r3=(g3-g2)/(f3-f2);%曲线3的斜率
b3=g2-r3*f2;%曲线3的截距
[m,n]=size(I);
K=double(I);
fori=1:
m
forj=1:
n
f=K(i,j);
g(i,j)=0;
if(f>=f0)&(f<=f1)
g(i,j)=r1*f+b1;%曲线1的方程y=r1*x+b1
else
if(f>=f1)&(f<=f2)
g(i,j)=r2*f+b2;%曲线2的方程y=r2*x+b2
else
if(f>=f2)&(f<=f3)
g(i,j)=r3*f+b3;%曲线3的方程y=r3*x+b3
end
end
end
end
end
subplot(3,3,7),imshow(uint8(g)),ylabel('变换图像(方法2)');
subplot(3,3,8),imhist(uint8(g));
(2)观察并记录实验结果:
作为实验报告的内容。
(3)将“分段曲线的第3个点”更改为“f1=200;g1=155;”,观察并记录实验结果,分析产生该结果的原因:
作为实验报告的内容。
4.灰度变换(对比拉伸)
(1)程序源代码:
closeall
clear
clc
disp('====E4_4_4.m====');
I=imread('rice.png');
subplot(2,3,1),imshow(I),ylabel('原图像');
subplot(2,3,2),imhist(I);
%图像的最小灰度值为40,最大灰度值为204
f0=0;g0=0;%分段曲线的第1个点
f1=90;g1=30;%分段曲线的第2个点
f2=150;g2=225;%分段曲线的第3个点
f3=255;g3=255;%分段曲线的第4个点19
subplot(2,3,6),plot([f0,f1,f2,f3],[g0,g1,g2,g3]),xlabel('f'),ylabel('g'),axis([02550255]);
%绘制变换曲线
r1=(g1-g0)/(f1-f0);%曲线1的斜率
b1=g0-r1*f0;%曲线1的截距
r2=(g2-g1)/(f2-f1);%曲线2的斜率
b2=g1-r2*f1;%曲线2的截距
r3=(g3-g2)/(f3-f2);%曲线3的斜率
b3=g2-r3*f2;%曲线3的截距
[m,n]=size(I);
K=double(I);
fori=1:
m
forj=1:
n
f=K(i,j);
g(i,j)=0;
if(f>=f0)&(f<=f1)
g(i,j)=r1*f+b1;%曲线1的方程y=r1*x+b1
else
if(f>=f1)&(f<=f2)
g(i,j)=r2*f+b2;%曲线2的方程y=r2*x+b2
else
if(f>=f2)&(f<=f3)
g(i,j)=r3*f+b3;%曲线3的方程y=r3*x+b3
end
end
end
end
end
subplot(2,3,4),imshow(uint8(g)),ylabel('对比拉伸变换图像');
subplot(2,3,5),imhist(uint8(g));
(2)观察并记录实验结果:
作为实验报告的内容。
(3)将“分段曲线的第3个点”更改为“f1=90;g1=225;”,观察并记录实验结果,分析产生该结果的原因:
作为实验报告的内容。
5.灰度变换(灰度切割)
(1)程序源代码:
closeall
clear
clc
disp('====E4_4_5.m====');
I=imread('rice.png');
subplot(3,3,1),imshow(I),ylabel('原图像');
subplot(3,3,2),imhist(I);
%######第1种方法######
%图像的最小灰度值为40,最大灰度值为204
f0=0;g0=100;%分段曲线的第1个点
f1=100;g1=100;%分段曲线的第2个点
f2=100;g2=240;%分段曲线的第3个点
f3=140;g3=240;%分段曲线的第4个点
f4=140;g4=100;%分段曲线的第5个点
f5=255;g5=100;%分段曲线的第6个点
subplot(3,3,6),plot([f0,f1,f2,f3,f4,f5],[g0,g1,g2,g3,g4,g5]),xlabel('f'),ylabel('g'),axis([02550255]);
%绘制变换曲线
r1=(g1-g0)/(f1-f0);%曲线1的斜率
b1=g0-r1*f0;%曲线1的截距
r2=(g2-g1)/(f2-f1);%曲线2的斜率
b2=g1-r2*f1;%曲线2的截距
r3=(g3-g2)/(f3-f2);%曲线3的斜率
b3=g2-r3*f2;%曲线3的截距
r4=(g4-g3)/(f4-f3);%曲线4的斜率
b4=g3-r4*f3;%曲线4的截距
r5=(g5-g4)/(f5-f4);%曲线5的斜率
b5=g4-r5*f4;%曲线5的截距
[m,n]=size(I);
K=double(I);
fori=1:
m
forj=1:
n
f=K(i,j);
g(i,j)=0;
if(f>=f0)&(fg(i,j)=r1*f+b1;%曲线1的方程y=r1*x+b1
else
if(f>=f1)&(fg(i,j)=r2*f+b2;%曲线2的方程y=r2*x+b2
else
if(f>=f2)&(fg(i,j)=r3*f+b3;%曲线3的方程y=r3*x+b3
else
if(f>=f3)&(fg(i,j)=r4*f+b4;%曲线4的方程y=r4*x+b4
else
if(f>=f4)&(f<=f5)
g(i,j)=r5*f+b5;%曲线5的方程y=r5*x+b4
end
end
end
end
end
end
end
subplot(3,3,4),imshow(uint8(g)),ylabel('第1种方法');
subplot(3,3,5),imhist(uint8(g));
%######第2种方法######
%图像的最小灰度值为40,最大灰度值为204
f0=0;g0=0;%分段曲线的第1个点
f1=100;g1=100;%分段曲线的第2个点
f2=100;g2=240;%分段曲线的第3个点
f3=140;g3=240;%分段曲线的第4个点
f4=140;g4=140;%分段曲线的第5个点
f5=255;g5=255;%分段曲线的第6个点
subplot(3,3,9),plot([f0,f1,f2,f3,f4,f5],[g0,g1,g2,g3,g4,g5]),xlabel('f'),ylabel('g'),axis([02550255]);
%绘制变换曲线
r1=(g1-g0)/(f1-f0);%曲线1的斜率
b1=g0-r1*f0;%曲线1的截距
r2=(g2-g1)/(f2-f1);%曲线2的斜率
b2=g1-r2*f1;%曲线2的截距
r3=(g3-g2)/(f3-f2);%曲线3的斜率
b3=g2-r3*f2;%曲线3的截距
r4=(g4-g3)/(f4-f3);%曲线4的斜率
b4=g3-r4*f3;%曲线4的截距
r5=(g5-g4)/(f5-f4);%曲线5的斜率
b5=g4-r5*f4;%曲线5的截距
[m,n]=size(I);
K=double(I);
fori=1:
m
forj=1:
n
f=K(i,j);
g(i,j)=0;
if(f>=f0)&(f<=f1)
g(i,j)=r1*f+b1;%曲线1的方程y=r1*x+b1
else
if(f>=f1)&(f<=f2)
g(i,j)=r2*f+b2;%曲线2的方程y=r2*x+b2
else
if(f>=f2)&(f<=f3)
g(i,j)=r3*f+b3;%曲线3的方程y=r3*x+b3
else
if(f>=f3)&(f<=f4)
g(i,j)=r4*f+b4;%曲线4的方程y=r4*x+b4
else
if(f>=f4)&(f<=f5)
g(i,j)=r5*f+b5;%曲线5的方程y=r5*x+b4
end
end
end
end
end
end
end
subplot(3,3,7),imshow(uint8(g)),ylabel('第2种方法');
subplot(3,3,8),imhist(uint8(g));
(2)观察并记录实验结果:
作为实验报告的内容。
(3)在“第1种方法”中将“分段曲线的第1个点”更改为“f0=0;g0=0;”,观察并记录实验结果,分析产生该结果的原因:
作为实验报告的内容。
(4)在“第2种方法”中将“分段曲线的第1个点”更改为“f0=0;g0=100;”,观察并记录实验结果,分析产生该结果的原因:
作为实验报告的内容。
6.灰度变换(对数变换)
(1)程序源代码:
closeall
clear
clc
disp('====E4_4_6.m====');
I=imread('rice.png');
subplot(3,3,1),imshow(I),ylabel('原图像');
subplot(3,3,2),imhist(I);
%对数变换
c=255/log(1+255);%语句1
x=0:
1:
255;
y=c*log(1+x);
subplot(3,3,6),plot(x,y),axistight,xlabel('f'),ylabel('g');
%绘制变换曲线
[m,n]=size(I);
K=double(I);
g=c*log(K+1);
%{
%等价的循环语句实现
fori=1:
m
forj=1:
n
g(i,j)=0;
g(i,j)=c*log(K(i,j)+1);
end
end
%}
subplot(3,3,4),imshow(uint8(g)),ylabel('对数变换');
subplot(3,3,5),imhist(uint8(g));
%###系统函数调用###
J=imadjust(I,[],[],0.216);
subplot(3,3,7),imshow(J),ylabel('对数变换(系统调用)');
subplot(3,3,8),imhist(J);
(2)观察并记录实验结果:
作为实验报告的内容。
(3)指出“语句1”把变量c定义为“c=255/log(1+255);”的原因。
(4)将“语句1”更改为“c=1”,观察并记录实验结果,分析产生该结果的原因:
作为实验报告的内容。
7.灰度变换(幂次变换)
(1)程序源代码:
closeall
clear
clc
disp('====E4_4_7.m====');
I=imread('rice.png');
subplot(3,3,1),imshow(I),ylabel('原图像');
subplot(3,3,2),imhist(I);
%幂次变换
C=1/(255^3);%语句1
x=0:
1:
255;
y=C*(x.^4);
subplot(3,3,6),plot(x,y),axistight,xlabel('f'),ylabel('g');
%绘制变换曲线
[m,n]=size(I);
K=double(I);
g=C*(K.^4);
%{
%等价的循环语句实现
fori=1:
m
forj=1:
n
g(i,j)=0;
g(i,j)=C*(K(i,j)^4);
end
end
%}
subplot(3,3,4),imshow(uint8(g)),ylabel('幂次变换');
subplot(3,3,5),imhist(uint8(g));
%###系统函数调用###
J=imadjust(I,[],[],4);
subplot(3,3,7),imshow(J),ylabel('幂次变换(系统调用)');
subplot(3,3,8),imhist(J);
(2)观察并记录实验结果:
作为实验报告的内容。
(3)指出“语句1”把变量c定义为“C=1/(255^3);”的原因。
(4)将“语句1”更改为“c=1”,观察并记录实验结果,分析产生该结果的原因:
作为实验报告的内容。
8.直方图处理(直方图均衡化)
(1)程序源代码:
closeall
clear
clc
disp('====E4_5_2.m====');
I=imread('tire.tif');
J=histeq(I);
subplot(2,2,1),imshow(I),ylabel('原图像');
subplot(2,2,2),imhist(I);
subplot(2,2,3),imshow(J),ylabel('直方图均衡图像');
subplot(2,2,4),imhist(J);
(2)观察并记录实验结果:
作为实验报告的内容。
(3)将图片“tire.tif”更改为另外一张新的图片,观察并记录实验结果:
作为实验报告的内容。
六、实验报告要求
1.实验名称、实验日期、学生姓名、班级、教学班号、学号。
2.实验目的和要求。
3.实验仪器、设备及材料
4.实验原理。
5.实验步骤。
6.实