原理:

直方图均衡化首先是一种灰度级变换的方法:

原来的灰度范围[r0,rk]变换到[s0,sk]变换函数为:s=T(r);

为便于实现,可以用查找表(look-up table)的方式存储,即:原始的灰度作为查找表的索引,表中的内容是新的灰度值。

其次,直方图均衡化是图像增强的一种基本方法,可提高图像的对比度,即:将较窄的图像灰度范围以一定规则拉伸至较大(整个灰度级范围内)的范围。

目的是在得到在整个灰度级范围内具有均匀分布的图像。

所以,当输入:直方图H(r)【此处指每个灰度级占有的像素数】;灰度级范围[r0,rk];目的是找到一个s=T(r)使得输出图像的直方图G(s)【同指】在整个灰度级范围内均匀分布。且需满足

(1)0—L(灰度范围)单调递增,避免黑白颠倒;

(2)0<r<L,时0<s<L,保持动态范围一致。

累积分布函数满足这几个要求。

\[\sum\limits_{i = 0}^k {G({s_i})}  = \sum\limits_{j = 0}^k {H({r_j})} \]

若图像有M*N个像素,则均衡化后的直方图G(q)就有均匀分布:

\[F = \frac{{NM}}{{{s_k} - {s_0}}}\]

代入上式:

\[NM\int\limits_{{s_0}}^s {\frac{1}{{{s_k} - {s_0}}}} ds = \frac{{NM(s - {s_0})}}{{{s_k} - {s_0}}} = \int\limits_{{r_0}}^r {H(r)} dr\]

则:

\[s = T(r) = \frac{{{s_k} - {s_0}}}{{NM}}\int\limits_{{r_0}}^r {H(r)} dr + {s_0}\]

转换成离散形式:

\[s = T(r) = \frac{{{s_k} - {s_0}}}{{NM}}\sum\limits_{{r_0}}^r {H(r)}  + {s_0}\]

一般\[{s_k} = 255,{s_0} = 0\]

自此就得到了与r相应的s。


matlab代码:

[filename,pathname]=uigetfile('*.*','select an image');
input_I=imread([pathname filename]);%读入图像 subplot(,,);imshow(input_I);
title('原始图像');%显示原始图像 I_gray = rgb2gray(input_I);
subplot(,,);imshow(I_gray);
title('灰度图像');
subplot(,,);imhist(I_gray);
title('灰度图像直方图');%显示灰度图像及直方图 [height,width]=size(I_gray); r=zeros(,);
for i=:height
for j=:width
r(I_gray(i,j)+)= r(I_gray(i,j)+)+;
end
end %计算灰度直方图中的数值:每个灰度级对应的像素数目。
subplot(,,);stem(r);
title('计算所得灰度图像直方图'); s=zeros(,);
s()=r();
for i=:
s(i)=s(i-)+r(i);
end %累积分布函数:对应的也是像素的数目。
subplot(,,);stem(s); for i=:
s(i)=floor(*s(i)/(height*width));
end % s(i)/(height*width) 为频率,* 为归一到0—255之间,floor为取整(整数部分)函数。【round为四舍五入函数,ceil为取整数部分加1】 I_HE=I_gray;
for i=:height
for j=:width
I_HE(i,j)= s(I_gray(i,j)+);
end
end%得到均衡化后的图像。s()~s()里的数值即为灰度值,~256标号对应的是原始灰度图像的0~255的灰度值。 m=zeros(,);
for i=:height
for j=:width
m(I_HE(i,j)+)= m(I_HE(i,j)+)+;
end
end %计算直方图中的数值:每个灰度级对应的像素数目。
subplot(,,);stem(m);
title('计算所得均衡化后图像直方图'); imwrite(I_gray,'1gray.png');
imwrite(I_HE,'1he.png');
subplot(,,);imshow(I_HE);
title('均衡化后的图像');
subplot(,,);imhist(I_HE);
title('均衡化后图像直方图');

结果:

问题

直方图确实拉伸了,人眼视觉上对比度也提升了,可是说好的均匀分布呢?

matlab 直方图均衡化的更多相关文章

  1. matlab 直方图均衡化(含rgb)

    步骤: 统计原图像素每个像素的个数 统计原图像<每个灰度级的像素的累积个数 家里灰度级得映射规则 将原图每个像素点的灰度映射到新图 代码: clear all I=imread('1.jpg') ...

  2. 彩色图像的直方图均衡化matlab代码

    彩色图像的直方图均衡化 - YangYudong2014的专栏 - CSDN博客 http://blog.csdn.net/yangyudong2014/article/details/4051503 ...

  3. 直方图均衡化与Matlab代码实现

    昨天说了,今天要好好的来解释说明一下直方图均衡化.并且通过不调用histeq函数来实现直方图的均衡化. 一.直方图均衡化概述 直方图均衡化(Histogram Equalization) 又称直方图平 ...

  4. 图像处理 Matlab实现线性点运算、非线性点运算、点运算与直方图、直方图均衡化

    今天,我们学习了直方图.于是乎,回来我就用matlab代码实现一下.昨天受到道路检测老师课上一个内容的影响(对于道路裂缝的检测,我突发奇想,如果对于道路图像进行操作,是否能够让裂缝与道路分离,使得图像 ...

  5. Matlab实现直方图均衡化

    G=imread('aini555.jpg'); I=rgb2gray(G); J=histeq(I); %直方图均衡化,这一个函数就可以做到均衡化的效果 figure, subplot(),imsh ...

  6. 直方图均衡化与直方图规定化的MATLAB实现

    目录 1.直方图均衡化 2.直方图规定化 @ 1.直方图均衡化 对图像进行非线性拉伸,重新分配图像像元值,使一定灰度范围内像元值的数量大致相等就是直方图的均衡化.原来直方图中间的峰顶部分对比度得到增强 ...

  7. MATLAB - 练习程序,直方图均衡化

    直方图均衡化的作用是图像增强. 有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布. 第一个问题.均衡化过程中,必须要保证两个条件:①像素无论怎么映射, ...

  8. 图像增强算法(直方图均衡化、拉普拉斯、Log、伽马变换)

    一.图像增强算法原理 图像增强算法常见于对图像的亮度.对比度.饱和度.色调等进行调节,增加其清晰度,减少噪点等.图像增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则 ...

  9. 对比度受限的自适应直方图均衡化(CLAHE)

    直方图均衡化(HE)是一种很常用的直方图类方法,基本思想是通过图像的灰度分布直方图确定一条映射曲线,用来对图像进行灰度变换,以达到提高图像 对比度的目的.该映射曲线其实就是图像的累计分布直方图(CDF ...

随机推荐

  1. 锁大全与 GDB调试

    1.innodb_lock_monitor:打开锁信息的方式 mysql> create table innodb_lock_monitor(id int) engine=InnoDB; Que ...

  2. 解决fonts.gstatic.com无法访问

    最近很多google的服务又在大陆地区受限了,原因不做过多讨论.屏蔽这些服务不仅仅意味着gmail,谷歌学术等方便的工具使用受到限制,更意味着很多寄托于google的web服务无法使用.wordpre ...

  3. QT 操作oracle数据库遇到的问题

    一.首先参考官方文档: http://qt-project.org/doc/qt-4.8/sql-driver.html#qoci 二.编译驱动: http://www.tuicool.com/art ...

  4. Android点击Button实现功能的几种方法

          Android中Button控件应该算作是比较简单的控件,然而,它的使用频率却是非常的高,今天,我在这里总结了三种常用的点击Button实现其功能的方法.       1.很多时候,我们在 ...

  5. linux上一些命令

    ps -ef看看有没有tomcat的进程:也可以用netstat -tnl来看tomcat的端口是否开放

  6. 1.4.2 solr字段类型--(1.4.2.5)使用枚举字段

    1.4.2 solr字段类型 (1.4.2.1) 字段类型定义和字段类型属性. (1.4.2.2) solr附带的字段类型 (1.4.2.3) 使用货币和汇率 (1.4.2.4) 使用Dates(日期 ...

  7. [Arduino] 在串口读取多个字符串,并且转换为数字数组

    功能如题目.在串口收到逗号分割的6串数字比如100,200,45,4,87,99然后在6个PWM端口3, 5, 6, 9, 10, 11输出对应PWM值代码注释很详细了,就不再说明了. //定义一个c ...

  8. Java基础知识强化106:Java中 int 的各进制之间的转换

    1.二.八.十.十六进制之间的转换  下面是示例代码,我们直接通过JDK工具库中的方法实现的,如下: public static Integer valueOf(String s, int radix ...

  9. 阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例

    阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例 阿里云技术支持:完颜镇江 问题现象: 磁盘空间满了,第一想到的就是删除无用的服务日志或者升级数据盘. 通常是使用du –sh去分析目录 ...

  10. Android中“再按一次返回键退出程序”实现

    private long exitTime = 0; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyC ...