图像处理灰度变换实验.docx
《图像处理灰度变换实验.docx》由会员分享,可在线阅读,更多相关《图像处理灰度变换实验.docx(24页珍藏版)》请在冰豆网上搜索。
图像处理灰度变换实验
一.实验名称:
空间图像增强
(一)
一.实验目的
1.熟悉和掌握利用matlab工具进行数字图像的读、写、显示、像素处理等数字图像处理的基本步骤和流程。
2.熟练掌握各种空间域图像增强的基本原理及方法。
3.熟悉通过灰度变换方式进行图像增强的基本原理、方法和实现。
4.熟悉直方图均衡化的基本原理、方法和实现。
二.实验原理
(一)数字图像的灰度变换
灰度变换是图像增强的一种经典而有效的方法。
灰度变换的原理是将图像的每一个像素的灰度值通过一个函数,对应到另一个灰度值上去从而实现灰度的变换。
常见的灰度变换有线性灰度变换和非线性灰度变换,其中非线性灰度变换包括对数变换和幂律(伽马)变换等。
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不同γ下的伽马变换曲线图
(二)直方图处理
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,其比例系数的设定也必须要合理。
(二)直方图处理
实验结果:
读取原图像,并显示,得到结果如图13。
图13原始图像
由图13知,原图像是一幅对比度较低,高低灰度不明显的图像。
通过自己编程(拒绝imhist函数)从灰度值为0开始,对每一个灰度拥有的像素数目进行统计,其中自变量为灰度,因变量为该灰度出现的次数或频率,绘制出两种定义下的灰度直方图如图14所示。
图14原始图像在两种定义下的直方图(自己编程)
结果分析:
从图14中得到,原图像的灰度值主要分布在80到150之间的很集中的范围内,最高灰度值与最低灰度值差距不大,造成了原图像的对比度偏低。
如果能将这部分主要集中的灰度均衡化,均匀地分布在0到255之间,对改善图片对比度有较大帮助。
通过离散情况下的直方图均衡化的原理和方法,将原图进行均衡化,得到结果如图15所示。
图15均衡化后的图像(自己编程)
结果分析:
在图15中,图像的对比度得到明显的改善,亮的地方灰度值更高,暗的地方灰度值更低,且没有出现杂乱无章的现象。
将均匀化后的灰度直方图绘制,得到如图16所示的直方图。
图16均衡化后的两种定义下的直方图(自己编程)
结果分析:
从图16可以得出,直方图明显得到均衡化,分布在0到255整个空间中,且没有出现某个区域过于集中的情况。
但由于离散情况的限制,直方图不能绝对地均匀平缓,只能得到近似的均衡化。
六.实验心得体会和建议
基于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
forj=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)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
ifx(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
%对每一个像素的灰度值,用循环分别进行变换
fori=1:
lo
forj=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('对数,伽马变换曲线图')
(二)直方图处理
%%读取原图像,并绘制原图像在两种定义下的直方图
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);%为各灰度级的像素出现的频率分配内存
fori=1:
256
hi(i)=length(find(I1==greylevel(i)));
%寻找等于第i个灰度级的像素并统计个数
p(i)=hi(i)/(lo*wi*1.0);
%统计上式结果出现的频率,其中分母出现1.0是为了采用double型进行操作
end
%创建一个图像窗口,同时显示两种顶一下的直方图,灰度级为横坐标,hi和p为纵坐标
figure
subplot(2,1,1),stem(greylevel,hi)
xlim([0,255])
title('原图灰度级出现的次数直方图')
subplot(2,1,2),stem(greylevel,p)
xlim([0,255])
title('原图灰度级出现的频率直方图')
%%直方图的均衡化
s=zeros(1,256);
s
(1)=p
(1);
fori=2:
256
s(i)=p(i)+s(i-1);%对于每一个灰度级出现的概率,进行累加操作
end
H=round(255*s);%用255与求和结果相乘,并四舍五入,将相似的灰度级归为一起
I2=zeros(lo,wi);%为均衡化的图像分配内存
%对新图的每一个像素的灰度级进行操作
fori=1:
lo
forj=1:
wi
I2(i,j)=H(I1(i,j)+1);
%均衡化后的图像的第(i,j)个像素等于原图该像素对应的灰度值被映