直方图均衡化
2015-08-25 15:57
225 查看
一、直方图均衡化原理
(1) 直方图均衡化思想
直方图均衡化处理是以累积分布函数为基础的直方图修正法,即通过一个灰度映射函数,将原直方图改造成所希望的直方图。基本思想是均衡化原始图像的灰度值,对在图像中像素个数较少的灰度级进行缩减,而对图像中像素个数较多的灰度级进行扩宽,使图像对应的直方图为均匀分布的形式。增强整体的对比度。
(2)均衡化的步骤
注:取整时可采用公式:k=int((L-1)*s+0.5);最后统计灰度变换后各灰度级的像素数目,再画出均衡后的直方图
(3)为什么选取累积分布函数
均衡化过程中,必须要保证两个条件:①像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;②如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数(本段参考:/article/9250534.html)
(4)直方图的计算
一幅8灰度级图像具有如下所示的直方图,求直方图均衡后的灰度级和对应概率,并画出均衡后的直方图的示意图。(计算中取整采用四舍五入方法,图中的8个不同灰度级对应的归一化直方图为[0.17 0.25 0.21 0.16 0.07 0.08 0.04 0.02])
下面再计算其累积分布函数:
把s值近似为最接近的整数,并得到直方图:
(5)不足之处
从以上计算中可以看出,虽然均衡化图像对比度增强,但其本质是扩大了量化间隔,而量化级别反而减少了,因此,原来灰度不同的象素经处理后可能变的相同,形成了一片的相同灰度的区域,各区域之间有明显的边界,从而出现了伪轮廓。经典的直方图均衡化算法可能存在以下一些不足:
1、输出图像的实际灰度变化范围很难达到图像格式所允许的最大灰度变化范围。
2、输出图像的灰度分布直方图虽然接近均匀分布, 但其值与理想值1/n仍有可能存在较大的差异, 并非是最佳值。
3、输出图像的灰度级有可能被过多地合并。由于灰度的吞噬也易造成图像信息的丢失。本段参考: www.cnblogs.com/cfantaisie/archive/2011/06/05/2073406.html
二、直方图均衡化的实现
(1)J=histeq(I,n);J为均衡化后得到的图像,n为均衡化后的灰度级数,默认值是64
(2)imhist(I,n);该函数绘制指定灰度级数目为n的直方图,n默认值为256
(3)具体代码:
(1) 直方图均衡化思想
直方图均衡化处理是以累积分布函数为基础的直方图修正法,即通过一个灰度映射函数,将原直方图改造成所希望的直方图。基本思想是均衡化原始图像的灰度值,对在图像中像素个数较少的灰度级进行缩减,而对图像中像素个数较多的灰度级进行扩宽,使图像对应的直方图为均匀分布的形式。增强整体的对比度。
(2)均衡化的步骤
注:取整时可采用公式:k=int((L-1)*s+0.5);最后统计灰度变换后各灰度级的像素数目,再画出均衡后的直方图
(3)为什么选取累积分布函数
均衡化过程中,必须要保证两个条件:①像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;②如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数(本段参考:/article/9250534.html)
(4)直方图的计算
一幅8灰度级图像具有如下所示的直方图,求直方图均衡后的灰度级和对应概率,并画出均衡后的直方图的示意图。(计算中取整采用四舍五入方法,图中的8个不同灰度级对应的归一化直方图为[0.17 0.25 0.21 0.16 0.07 0.08 0.04 0.02])
下面再计算其累积分布函数:
把s值近似为最接近的整数,并得到直方图:
(5)不足之处
从以上计算中可以看出,虽然均衡化图像对比度增强,但其本质是扩大了量化间隔,而量化级别反而减少了,因此,原来灰度不同的象素经处理后可能变的相同,形成了一片的相同灰度的区域,各区域之间有明显的边界,从而出现了伪轮廓。经典的直方图均衡化算法可能存在以下一些不足:
1、输出图像的实际灰度变化范围很难达到图像格式所允许的最大灰度变化范围。
2、输出图像的灰度分布直方图虽然接近均匀分布, 但其值与理想值1/n仍有可能存在较大的差异, 并非是最佳值。
3、输出图像的灰度级有可能被过多地合并。由于灰度的吞噬也易造成图像信息的丢失。本段参考: www.cnblogs.com/cfantaisie/archive/2011/06/05/2073406.html
二、直方图均衡化的实现
(1)J=histeq(I,n);J为均衡化后得到的图像,n为均衡化后的灰度级数,默认值是64
(2)imhist(I,n);该函数绘制指定灰度级数目为n的直方图,n默认值为256
(3)具体代码:
版本一:利用自带函数 clear all; close all; I=imread('tire.tif'); J=histeq(I,64); figure; subplot(121); imshow(uint8(I)); subplot(122); imshow(uint8(J)); figure; subplot(121); imhist(I,64); subplot(122); imhist(J,64);
版本二:自编函数 clc; clear; close all; I=imread('pout.tif'); [m,n]=size(I); J=zeros(1,256); %灰度值统计个数,存放在J中,第i列代表,像素值为i的个数为J(i); for i=1:m for j=1:n k=I(i,j); J(k+1)=J(k+1)+1; end end %bar(J);可以用bar画出原始图像直方图(这里的直方图没有归一化) subplot(2,2,1) imshow(I); subplot(2,2,2) imhist(I); %计算灰度级像素值个数的概率大小 Z=zeros(1,256); for i=1:256 Z(i)=J(i)/(m*n); end %计算累积分布函数 G=zeros(1,256); G(1)=Z(1); for i=2:256 G(i)=G(i-1)+Z(i); end %上面计算累积分布函数,可以用函数cumsum(Z)代替 %累积分布函数取整,将其归一到1—256; G=uint8(255*G+0.5); %对图像进行均衡化 for i=1:m for j=1:n I(i,j)=G(I(i,j)+1); end end subplot(2,2,3) imshow(I); subplot(2,2,4) imhist(I); 本代码原作者:http://blog.csdn.net/xiajun07061225/article/details/6910129
相关文章推荐
- Spring+mybatis配置动态数据源
- building live555 library for iphoneos
- 找不到要编译的文件——path环境变量配置
- 第七章 压缩列表
- nginx源码安装
- ubuntu下找会root的密码
- sql中in和exists的区别效率问题(转)
- 文章标题
- 容易失误的清单
- c语言与c++区别
- Spring Data JPA 常用注解 @Query、@NamedQuery
- gpon系统---omci的位置
- UVA - 1395 Slim Span (最小生成树Kruskal)
- 在线学习
- PS 滤镜— —水波效果
- 计算机网络组网与配置技术—— 读书笔记4、网络设备
- 数据结构之循环单链表
- 二叉树遍历
- 离线安装ADT 23.0.4遇到的问题与解决方法
- [leetcode][单调性] Next Permutation