图像处理之直方图均衡化

来源:互联网 发布:德国国防军军装 淘宝 编辑:程序博客网 时间:2024/04/25 15:33

  Matlab 直方图均衡化 

  直方图均衡化又称直方图修平,是一种很重要的非线性点运算。使用该方法可以加强图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好的在直方图上分布。

  直方图均衡化的基本思想是把原始图像的直方图变换为均匀分布的形式。这样增加了灰度值的动态范围,从而达到增强图像整体对比度的效果,直方图均衡化是图像增强的一种基本方法,可提高图像的对比度,即:将较窄的图像灰度范围以一定规则拉伸至较大(整个灰度级范围内)的范围。目的是在得到在整个灰度级范围内具有均匀分布的图像。

注:对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小。差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就可容易地显示生动、丰富的色彩,当对比率高达300:1时,便可支持各阶的颜色。

      实行步骤:

对图像(灰度图)进行直方图均衡化主要有一下几个步骤:

1、计算各个灰度值(0-255)出现的次数,即统计直方图.

2、用统计直方图计算各个灰度值的累积分布图,就是从1到这个灰度的所有点的个数。

2、根据累积分布图s(k)归一化计算出原来各灰度值的均衡化之后的新的值。新的灰度值=255*(s(k)/nm)。

    实现代码:

Image=imread('sc.png');% 以对话框的形式选择打开一幅图像[m,n,nDims]=size(Image);subplot(3,3,1);imshow(uint8(Image));title('原始图像');%显示原始图像Image=rgb2gray(Image);subplot(3,3,4);imshow(Image);title('灰度图像');subplot(3,3,5);imhist(Image);title('灰度图像直方图');%显示灰度图像及直方图r=zeros(256,1);for i=1:m   for j=1:n       r(Image(i,j)+1,1)= r(Image(i,j)+1,1)+1;    endend  %计算灰度直方图中的数值:每个灰度级对应的像素数目。subplot(3,3,6);stem(r);title('计算所得灰度图像直方图');s=zeros(256,1);s(1,1)=r(1,1);for i=2:256    s(i,1)=s(i-1,1)+r(i,1);end         %累积分布函数:对应的也是像素的数目。subplot(3,3,9);stem(s);title('累积分布直方图');for i=1:256    s(i,1)=floor(255*s(i,1)/(m*n));end   % s(i)/(height*width) 为频率,*256 为归一到0—255之间,floor为取整(整数部分)函数。【round为四舍五入函数,ceil为取整数部分加1】subplot(3,3,8);stem(s);title('累积分布归一化直方图');I_HE=Image;for i=1:m   for j=1:n       I_HE(i,j)= s(Image(i,j)+1);    endend%得到均衡化后的图像。s(1)~s(256)里的数值即为灰度值,1~256标号对应的是原始灰度图像的0~255的灰度值。k=zeros(256,1);for i=1:m   for j=1:n       k(I_HE(i,j)+1)= k(I_HE(i,j)+1)+1;    endend  %计算直方图中的数值:每个灰度级对应的像素数目。subplot(3,3,7);stem(k);title('计算所得均衡化后图像直方图');subplot(3,3,2);imshow(I_HE);                          title('均衡化后的图像');subplot(3,3,3);imhist(I_HE);title('均衡化后图像直方图');

     结果:



       注解:

10 matlab中小数取整的函数大约有四个:floor、ceil、round、fix
   floor:朝负无穷方向靠近最近的整数;
   ceil:朝正无穷方向靠近最近的整数;
   round:取最近的整数(相当于四舍五入)
   fix:取离0最近的整数


11 rgb2gray() rgb图像灰度化,也就是变成单通道图像。size()可以获取图像的长、宽和波段数。


13 imhist()用来显示图像数据灰度级统计直方图。 imhist(I,n)  计算和显示图像I的直方图,n为指定的灰度级数目,默认为256。如果I是二值图像,那么n仅有两个值。


14 subplot(m,n,p)、subplot(mnp)是将多个图画到一个平面上的工具。其中,m表示是图排成m行,n表示图排成n列,也就是整个figure中有n个图是排成一行的,一共m行,p是指你现在要把曲线画到figure中哪个图上,最后一个如果是1表示是从左到右第一个位置。


15 plot 是绘制二维图形的最基本函数,它是针对向量或矩阵的列来绘制曲线的。也就是说,使用plot 函数之前,必须首先定义好曲线上每一点的x 及y 坐标,常用格式为:
   (1)plot(x) 当x 为一向量时,以x 元素的值为纵坐标,x 的序号为横坐标值绘制曲线。当x 为一实矩阵时,则以其序号为横坐标,按列绘制每列元素值相对于其序号的曲
        线,
   (2)plot(x,y) 以x 元素为横坐标值,y 元素为纵坐标值绘制曲线。
   (3)plot(x,y1,x,y2,…) 以公共的x 元素为横坐标值,以y1,y2,… 元素为纵坐标值绘制多条曲线。


16 title()在图形正上方加个标题。


17 stem()该句法表示绘制数据序列Y。
   在绘制时,Y的数据是根据等距离的并且自动生成的x轴数据扩展而来的。如果Y是向量,等距离生成一个值为相应值的stem;如果Y是一个矩阵,该句法表示每一行的x值是相同的,每一列的x值间隔是等距的。


18 数组(array)就是我们最熟悉的array,在Matlab可以建立任意尺寸和维数,只要你的内
存足够不够的时候会提示。
   向量(vector)特指1*n或n*1的数组,前者称为行向量,后者称为列向量。
   矩阵(matrix)一般特指二维数组,其它与数组相同。


19 figure 创建一个窗口。
   figure
   figure('PropertyName'.'propertyvalue')
   figure(h)
   h=figure(...)


20 s(1,:)是取矩阵s中的第一行的所有元素,:是所有列的默认;:放前面就是所有行的默认。


参考文章:http://www.cnblogs.com/diligentcalf/p/4063493.html

1 0