图像处理灰度变换实验.docx
《图像处理灰度变换实验.docx》由会员分享,可在线阅读,更多相关《图像处理灰度变换实验.docx(25页珍藏版)》请在冰豆网上搜索。
图像处理灰度变换实验
一、实验名称:
空间图像增强
(一)
一.实验目得
1.熟悉与掌握利用matlab工具进行数字图像得读、写、显示、像素处理等数字图像处理得基本步骤与流程。
2.熟练掌握各种空间域图像增强得基本原理及方法.
3.熟悉通过灰度变换方式进行图像增强得基本原理、方法与实现.
4.熟悉直方图均衡化得基本原理、方法与实现。
二.实验原理
(1)数字图像得灰度变换
灰度变换就是图像增强得一种经典而有效得方法。
灰度变换得原理就是将图像得每一个像素得灰度值通过一个函数,对应到另一个灰度值上去从而实现灰度得变换.常见得灰度变换有线性灰度变换与非线性灰度变换,其中非线性灰度变换包括对数变换与幂律(伽马)变换等。
1、线性灰度变换
1)当图像成像过程曝光不足或过度,或由于成像设备得非线性与图像记录设备动态范围太窄等因素,都会产生对比度不足得弊病,使图像中得细节分辨不清,图像缺少层次。
这时,可将灰度范围进行线性得扩展或压缩,这种处理过程被称为图像得线性灰度变换。
对灰度图像进行线性灰度变换能将输入图像得灰度值得动态范围按线性关系公式拉伸扩展至指定范围或整个动态范围。
2)令原图像f(x,y)得灰度范围为[a,b],线性变换后得到图像g(x,y),其灰度范围为[c,d],则线性灰度变换公式可表示为
(1)
由
(1)式可知,对于介于原图像f(x,y)得最大与最小灰度值之间得灰度值,可通过线性变换公式,一一对应到灰度范围[c,d]之间,其斜率为(d-c)/(b-a);对于小于原图像得最小灰度值或大于原图像得最大灰度值得灰度值,令其分别恒等于变换后得最小与最大灰度值。
变换示意图如图1所示。
图1 线性灰度变换示意图
当斜率大于一时,变换后得灰度值范围得到拉伸,图像对比度得到提高;当斜率小于一时,变换后得灰度值范围被压缩,最小与最大灰度值得差变小,图像对比度降低;当斜率等于一时,相当于对图像不做变换.
3)由上述性质可知,线性灰度变换能选择性地加强或降低特定灰度值范围内得对比度,故线性灰度变换同样也可做分段处理:
对于有价值得灰度范围,将斜率调整为大于一,用于图像细节;对于不重要得灰度范围,将图像压缩,降低对比度,减轻无用信息得干扰。
最常用得分段线性变换得方法就是分三段进行线性变换。
在原图像灰度值得最大值与最小值之间设置两个拐点,在拐点处,原图像得灰度值分别为r1,r2,该拐点对应得变换后得图像得灰度值分别为s1,s2,另外,取原图像灰度得最小值为r0,最大值为rm,对应得变换后得灰度值分别为s0,sm.则分段线性灰度变换公式为
(2)
调整公式中得各个参数,即可得到不同得变换效果
4)在线性灰度变换中,有一种特殊得变换,叫做图像反色.通过图像反色变换,每一个像素点得变换前后得灰度值之与为白色(255)。
图像反色得变换公式为
(3)
当L取为256时,实现图像反转变色
2、非线性灰度变换
除了图像灰度得线性变换外,还有非线性灰度变换。
非线性灰度变换不就是对图像得所有灰度值进行拉伸,一部分被拉伸,另一部分则会被压缩.非线性灰度变换在整个灰度值范围内采用统一得变换函数。
比较常见得有对数变换与幂律(伽马)变换等。
1)对数变换
设原图像为f(x,y),变换后得图像为g(x,y),对数变换得变换函数为
(4)
(4)式中,c就是一个比例因子,log就是求以e为底得数值得对数,原图像灰度值加1得目得就是保证对数变化对于任何灰度值都有意义.c取适当得值,可得到对数变换得函数图像如图2所示。
图2对数变换函数曲线
由图2可知,通过对数变换,对于较低得灰度值起到较大程度得拉伸作用,而对于较高得灰度值起到压缩作用,从而将整幅图像得灰度值均匀化.
2)幂律(伽马)变换
伽马变换可通过调节幂指数参数来改变其变换特性,设f(x,y)与g(x,y)分别为变换前后得图像,γ为幂指数,c为比例系数,则伽马变换得公式如下
(5)
对于c为正值得情况,当γ〉1时,伽马变换将低灰度值压缩,高灰度值拉伸;当γ〈1时,伽马变换将低灰度值拉伸,高灰度值压缩,类似对数变换;当γ=1时,等同于对原图像进行线性变换。
伽马变换得曲线图如图3所示
图3不同γ下得伽马变换曲线图
(2)直方图处理
1、直方图得两种定义
直方图就是反映一幅图像中得灰度级与出现这种灰度级得次数或概率之间得关系得统计图表。
直方图有两种定义,分别如下。
1)定义1:
一幅灰度级范围在[0,L-1]得数组图像得直方图定义为以下离散函数:
(6)
其中rk就是第k个灰度级,nk就是图像中灰度级为rk得像素个数,k=0,1,2、、、L-1。
2)定义2:
一幅灰度级范围[0,L—1]得数组图像得直方图定义为以下离散函数:
(7)
其中rk与nk得意义同定义1,n就是指图像得像素总数。
此处,直方图便就是图像中不同灰度级像素出现得概率。
通过观察一幅图像得直方图可以判断这幅图像得对比度与清晰度,也可以掌握图像得明暗程度。
但就是直方图只能反映灰度值出现得概率,并不能反映各个灰度值在空间得分布情况。
2、直方图得均衡化
直方图得均衡化就是将原图像得直方图通过变换函数修正为均匀得直方图,然后按照均衡后得直方图修正原图像.图像均衡化后,理论上,图像得直方图完全平直,即各个灰度级具有近似相同得出现频率。
直方图均衡化得作用就就是实现了灰度级得均匀分布,增加了图像得对比度,使得图像瞧起来更清晰.
直方图均衡化得原理与方法如下.设r与s分别表示归一化了得原图像灰度与经直方图修正后得图像灰度。
在[0,1]区间内,对任意一个灰度级r,可通过一种对应法则对应到灰度级s,设这种对应法则为T,则
(8)
为了使变换后得灰度仍保持从暗到亮得单一变化顺序,且变换范围与变换前保持一致,以避免整体变量或变暗,一般规定:
①正变换,在0≤r≤1中,T(r)为单调递增函数,且0≤T(r)≤1;②反变换,r=T—1(s),T-1(s)也为单调递增函数,即0≤s≤1。
考虑到灰度变换不影响像素得位置分布且不增减像素数目,所以有
(9)
而实际图像就是有许多离散得像素点与离散得灰度级构成得,对于离散得情况,均衡化后得效果将受到一定限制,不一定绝对平整。
离散情况下得均衡化方法如下。
设一幅图像得像素总数为n,分为L个灰度级。
若nk为第k个灰度级出现得频数,则第k个灰度级出现得概率为p(rk)=nk/n,其中,0≤rk≤1,k=0,1,2,、、、,L—1。
变换后得灰度为
(10)
可以瞧出,离散情况下得直方图均衡化就是将连续得积分转化为离散得叠加求与,可近似得到直方图平直得效果.
三.实验器材
PC,MATLAB软件(各版本),若干幅图像
四.实验步骤
(一)数字图像得灰度变换
1、线性灰度变换
1)在MATLAB中用imread函数读取原图像,将其赋值给某个矩阵,如I1,进而用imshow函数显示。
2)检测图像得通道数目,即检测矩阵得高度,若超过了1个通道,将矩阵灰度化,变为单通道得灰度图。
3)将矩阵中所有得8位整形元素转换为double型,便于计算得更精确,特别就是进行除法运算得时候。
4)用max函数与min函数得到原图像中灰度得最大值与最小值。
5)预分配一个内存给矩阵I2,对矩阵中得每一个元素进行循环检测,并将每一个元素得灰度值带入线性灰度变换公式,即公式
(1),其中,令d=250,c=10。
将每一个变换后得像素灰度存入矩阵I2得相应元素位置上。
6)将变换后得矩阵转换为8位整形,并将其显示出来,以另一个文件名得形式保存。
7)绘制变换前后两幅图像得灰度直方图,将其与相应得图像一起,用一张图展示出来.
8)绘制函数曲线。
具体实验得流程图如图4所示.
图4线性灰度变换实验流程图
2、非线性灰度变换
1)在MATLAB中用imread函数读取原图像,将其赋值给某个矩阵,如I1,进而用imshow函数显示。
2)检测图像得通道数目,即检测矩阵得高度,若超过了1个通道,将矩阵灰度化,变为单通道得灰度图。
3)将矩阵中所有得8位整形元素转换为double型,便于计算得更精确,特别就是进行求对数运算得时候。
5)预分配内存给矩阵I2,I3,用于存放对数变换与伽马变换后得图像灰度值。
4)对数变换:
取比例系数c=5,对原图像得每一个像素进行循环检测,并将其灰度值代入公式(4)进行对数变换,将变换后得灰度值存在矩阵I2得相应元素位置上。
5)对图像进行显示,由于经过对数变换后,所有得灰度值均处于较低水平,直接显示将导致图像过暗不便观察。
所以,采用MATLAB内部得拉伸方式将图像显示,函数为imshow(I2,[])。
6)伽马变换:
合理设置比例系数与指数,以免变换后得灰度值超过255.取比例系数c=1/255,指数γ=2,对原图像得每一个像素进行循环检测,并将其灰度值代入公式(5)进行伽马变换,将变换后得灰度值存在矩阵I3得相应元素位置上。
7)对图像进行显示,也采用MATLAB内部得拉伸方式将图像显示,函数为imshow(I3,[])。
8)利用plot函数与holdon命令将对数变换与伽马变换得函数曲线绘制在同一幅坐标图上。
对数变换与伽马变换得实验流程图如图5所示.
图5非线性灰度变换流程图
说明:
本实验将对数变换与幂律(伽马)变换均做了练习。
(二)直方图处理
1)在MATLAB中用imread函数读取原图像,将其赋值给某个矩阵,如I1,进而用imshow函数显示。
2)检测图像得通道数目,即检测矩阵得高度,若超过了1个通道,将矩阵灰度化,变为单通道得灰度图。
3)统计矩阵得行列数。
4)利用统计带有某个灰度得像素得数目绘制直方图。
在MATLAB中,对灰度级0—255依次寻找,可用find函数找到带有相应灰度得像素得位置,再用length函数求出这些位置得数目,即像素得个数,结合bar函数或stem函数绘制原图像得灰度直方图;将各灰度得像素个数除以总像素数,得到第二种定义下得灰度直方图,即灰度出现概率,绘制。
5)对第二种定义下得灰度直方图进行操作。
从灰度为0开始,对于该灰度出现得概率,与之前得灰度概率总与进行叠加,直到255,总与为1。
6)用255与每一个灰度所在得概率与相乘,再四舍五入,将不同得概率归并为同一概率。
7)对照该对应法则,将原图中相应位置得灰度进行替换,图像得到均衡化,对比度得到提高,将图像显示出来。
8)再利用之前得方法,绘制均衡化后得灰度直方图,分析结果找到规律。
直方图均衡化得流程图如图6所示。
图6直方图均衡化流程图
五.实验结果及分析
(一)数字图像得灰度变换
1、线性灰度变换
实验结果:
1)将原图片与线性变换后得图片以及其灰度直方图绘制在同一张图片上,得到如图7所示结果。
图7线性灰度变换前后得图像与灰度直方图
由实验结果可知,原图片得灰度值情况如下:
最小灰度为49,最大灰度为181,较多出现得灰度值主要集中在120到160之间。
实验中,我们规定,变换后得图像得最低灰度值为10,最高灰度值为250,实现线性灰度变换,得到图7中得结果。
2)绘制本实验中得线性灰度变换函数曲线。
本实验中线性灰度变换得函数曲线如图8所示。
图8线性灰度变换得曲线图
由图8知,当灰度小于等于49时,变换后得灰度值等于10;当灰度值大于等于181时,变换后得灰度值等于250;当灰度值介于49与181之间时,变换后得灰度值通过线性变换函数与原灰度值一一对应。
结果分析:
线性灰度变化将原图像得每一个灰度进行了线性变换,拉伸(或压缩了)原图像得灰度范围,但就是不改变具有各灰度值得像素得数量,不改变灰度得分布,即不改变灰度直方图得形状.本实验中,将灰度范围做了线性得拉伸变换从而扩大了灰度范围,故原图像得最高灰度值增大,最低灰度值减小,从而实现了图像对比度得增大。
2、非线性灰度变换
实验结果:
输入原图像,并将原图像显示出来,得到结果如图9所示。
图9原始图像
由图9可得,原图像就是一个具有高、低灰度值得图像。
令比例系数c=5,对原图像进行对数变换,并用MATLAB内部方法对图像得灰度范围进行拉伸,即imshow(,[]),得到如图10所示得图像。
图10通过对数变换并拉伸后显示得图像
结果分析:
从图10中得知,人物部分得像素灰度值变得近似相等,背景部分得像素灰度仍保持较低水平。
这就是由灰度变换得特性决定得,灰度变换可将高灰度值部分有效地压缩,低灰度部分有效地拉伸,使得整幅图像得灰度保持在十分接近得水平。
对原图进行伽马变换,令指数γ=2,令比例系数c=1/255,这就是为了保证经过伽马变换后,原图得灰度值得最大值不会超过255得充分条件。
经过伽马变换后,得到如图11所示结果。
图11通过伽马变换并拉伸后显示得图像
结果分析:
由图11可以瞧出,原图中人物较暗得部分变得更暗,相比之下,原本亮得地方,变得相对更亮,但与原图比稍显暗,这就是由比例系数得设定所致。
如果考虑原图经过斜率为1得线性变化后仍为原图,而伽马变换在0至255范围内得整个函数曲线均在y=x之下,所以灰度值不会比原图高,但自身得高低灰度级间相对差值变大。
将本实验中对数变换与伽马变换得曲线绘制在同一幅坐标图中,得到如图12所示得结果。
图12对数变换与伽马变换得函数曲线图
结果分析:
从图12中可以瞧出,对数变换得曲线整体处于较低水平,若要将其调高,可通过调整比例系数c,或在显示时再次进行一定得拉伸,如线性灰度变换;为防止伽马变换后得灰度值超过255,其比例系数得设定也必须要合理.
(2)直方图处理
实验结果:
读取原图像,并显示,得到结果如图13。
图13 原始图像
由图13知,原图像就是一幅对比度较低,高低灰度不明显得图像。
通过自己编程(拒绝imhist函数)从灰度值为0开始,对每一个灰度拥有得像素数目进行统计,其中自变量为灰度,因变量为该灰度出现得次数或频率,绘制出两种定义下得灰度直方图如图14所示。
图14原始图像在两种定义下得直方图(自己编程)
结果分析:
从图14中得到,原图像得灰度值主要分布在80到150之间得很集中得范围内,最高灰度值与最低灰度值差距不大,造成了原图像得对比度偏低。
如果能将这部分主要集中得灰度均衡化,均匀地分布在0到255之间,对改善图片对比度有较大帮助。
通过离散情况下得直方图均衡化得原理与方法,将原图进行均衡化,得到结果如图15所示.
图15均衡化后得图像(自己编程)
结果分析:
在图15中,图像得对比度得到明显得改善,亮得地方灰度值更高,暗得地方灰度值更低,且没有出现杂乱无章得现象.将均匀化后得灰度直方图绘制,得到如图16所示得直方图。
图16均衡化后得两种定义下得直方图(自己编程)
结果分析:
从图16可以得出,直方图明显得到均衡化,分布在0到255整个空间中,且没有出现某个区域过于集中得情况.但由于离散情况得限制,直方图不能绝对地均匀平缓,只能得到近似得均衡化。
6.实验心得体会与建议
基于MATLAB光电图像处理实验巩固了我们在课上学得图像处理原理与方法,锻炼了我们得逻辑思维能力与动手能力。
在实验过程中尤其应当注意矩阵得尺寸、矩阵元素得数据类型与矩阵得非线性运算操作如乘除。
当对于每一个元素操作时可采用循环语句逐一操作.为了运算更精确,建议将矩阵得数据类型改为double型,根据需要,在显示时转换回8位整形。
下一步,应当在算法优化得角度多做练习,使得算法更加简捷准确。
七、程序源代码
(一)数字图像得灰度变换
1、线性灰度变换
%% 图片得线性灰度变换
clear,clc
I1=imread('huitu、jpg'); %读取图片文件huitu、jpg,赋值给矩阵I1
%图片得提取路径需在MATLAB命令窗口设置好
subplot(2,2,1),imshow(I1); %在一张2×2图得第1个位置显示I1
title(’原图片’);
ifsize(I1,3)>1
I1=rgb2gray(I1); %满足条件,将瞧似为黑白图得多通道图转化为灰度图
end
I1=double(I1); %将图片灰度得数据类型转变为double型
%这一部转化很重要,在后续得计算中,尤其就是除法,运算结果能保证更高得精度
[lo,wi]=size(I1); %获得矩阵I1得行列尺寸,以备单个像素处理时得循环算法
a=min(min(I1)); %得到原图(I1)所有像素灰度得最小值
b=max(max(I1)); %得到原图(I1)所有像素灰度得最小值
I2=zeros(lo,wi); %初始化矩阵I2,为处理后得图像分配内存
c=10;d=250; %设置灰度线性拉伸后得灰度最小值与最大值
%接下来,对矩阵I1中得逐个像素进行线性灰度变换,并存到I2相应位置
fori=1:
lo
for j=1:
wi
I2(i,j)=(d-c)/(b-a)*(I1(i,j)—a)+c; %线性灰度变换公式
end
end
I1=mat2gray(I1);I2=mat2gray(I2); %将变换后得矩阵I1、I2转换为8位整型
subplot(2,2,2),imshow(I2); %在一张2×2图得第2个位置显示I2
title('线性灰度变换后得图片');
imwrite(I2,'线性灰度变换后得图片、bmp',’bmp') %以另一个文件名形式保存图像
subplot(2,2,3),imhist(I1); %在一张2×2图得第3个位置显示I1得灰度直方图
ylim([0,7000]),title('原图片灰度直方图’);
subplot(2,2,4),imhist(I2);%在一张2×2图得第4个位置显示I2得灰度直方图
ylim([0,7000]),title(’变换后图片灰度直方图’);
%% 画灰度变换曲线
x=0:
255; %设置0到255共256级灰度级
y=zeros(1,256); %设置全0向量,为线性灰度变换后得数值分配内存
%按灰度级,从0到255开始循环,即x(1)到x(256)
fori=1:
256
ifx(i)<a
y(i)=c; %当原图灰度值小于a,变换后灰度恒为c
end
ifx(i)〉=a&&x(i)〈=b
y(i)=(d-c)/(b-a)*(x(i)-a)+c; %当原图灰度介于a,b之间,用公式变换
end
if x(i)>b
y(i)=d; %当原图灰度介于a,b之间,用公式变换
end
end
figure,plot(x,y) %创建新得图片窗口,显示变换函数曲线
title('线性变换曲线图'),xlim([0,255]),ylim([0,255])
ylim([0,255]); %限定横坐标范围为0到255
2、非线性灰度变换
%%对图像做非线性变换
clear,clc
I1=imread('Ein、jpg'); %读取图像文件Ein、jpg,赋值给矩阵I1
figure,imshow(I1); %创建一个图像显示窗口并显示图像
title(’原图像’)
ifsize(I1,3)〉1
I1=rgb2gray(I1); %满足条件,将三通道得图片变为灰度图
end
I1=double(I1); %将图片得数据类型转变为double型,以便后续计算准确
[lo,wi]=size(I1); %得到矩阵I1得行数与列数,即像素个数
I2=zeros(lo,wi);
I3=zeros(lo,wi); %创建两个全零矩阵用于存放对数与伽马变换后得矩阵
%%对图像做对数变换
c=5;d=1/255; %令对数变换中得比例系数为5,伽马变换中得比例系数为1/255
%对每一个像素得灰度值,用循环分别进行变换
for i=1:
lo
for j=1:
wi
I2(i,j)=c*log(1+I1(i,j)); %对数变换公式
end
end
I2=mat2gray(I2); %必须将double型得矩阵还原为8位整型才能显示
figure,imshow(I2,[]) %显示时由于灰度太低,需要MATLAB得内部方式进行拉伸
title('通过对数变换后得图像')
imwrite(I2,’通过对数变换后得图像、bmp’,'bmp') %保存成一个新得文件
%%对图像做伽马变换
fori=1:
lo
forj=1:
wi
I3(i,j)=d*I1(i,j)^2; %伽马变换公式,指数为2
end
end
I3=mat2gray(I3); %还原为整型
figure,imshow(I3,[]) %创建图像窗口,也要伸展显示
title('通过伽马变换后得图像’)
imwrite(I3,’通过伽马变换后得图像、bmp','bmp') %保存成一个新文件
%%显示对数变换与伽马变换得函数曲线
x=0:
255;
y1=zeros(1,256);
y2=zeros(1,256); %规定x坐标,并且为非线性变换后得数值分配内存
%对每一个灰度级进行相应得变换
fori=1:
256
y1(i)=c*log(1+x(i));
y2(i)=d*x(i)^2;
end
figure
plot(x,y1),holdon %在同一幅坐标图上绘制两个变换函数
plot(x,y2)
xlim([0,255]),ylim([0,255]) %创建新窗口,显示
title('对数,伽马变换曲线图')
(2)直方图处理
%% 读取原图像,并绘制原图像在两种定义下得直方图
I1=imread(’youngboy、jpg'); %读取图像文件youngboy、jpg并赋值给I1
figure,imshow(I1) %创建一个图像窗口,显示图像youngboy、jpg
title(’原图')
ifsize(I1,3)>1
I1=rgb2gray(I1); %满足条件时将彩图灰度化
end
[lo,wi]=size(I1); %获取图像矩阵得长与宽
greylevel=0:
255; %创建存储灰度级得向量
hi=zeros(1,256); %为各灰度级得像素数目分配内存
p=zeros(1,256);%为各灰度级