算法

经典算法

下面以一幅3*2像素的简单图片(图C)为例,来说明灰度直方图均衡化的算法。

(图C)

图C的直方图:

注意看百分位(Percentile)这一项。一般软件的百分位是 当前色阶的像素数量÷总像素数量,而Photoshop不同,Photoshop显示的是 当前色阶与前面色阶的所有像素数量÷总像素数量。因此图C色阶为100时的百分位就是(3+2)/6=5/6=83.33%,这个百分位其实就是我们要求的灰度值(范围0~1),把它转换成0~255的范围,要再乘255。

求出每个色阶的百分位之后,再乘255,就可以求出与其对应的灰度值来。

色阶 数量 出现频率 百分位 255*百分位
50 3 3/6 3/6=50% 255*50%=128
100 2 2/6 (3+2)/6=83.33% 255*83.33%=212
200 1 1/6 (3+2+1)/6=100% 255*100%=255

根据每个色阶的 色阶->255*百分位 的对应关系组成一个灰度映射表,然后根据映射表来修改原来图片每个像素的灰度值。对于图C,用128替换50,用212替换100,用255替换200。这样,灰度直方图的均衡化就完成了。

Photoshop的算法

经过经典算法均衡化的图片,最亮的像素值总是255,因为最后一级色阶(255)的百分位一定是100%。而最暗的是由色阶0的数量决定的,像素值不一定是0。

Photoshop通过对比度拉伸的方法使最暗的像素值变为0,其它像素也相应变暗,最亮的像素保持255不变。对比度拉伸后的效果可能会比经典算法稍显偏暗。

对比度拉伸的算法,类似于使用色阶调整命令把黑场设成Min时的效果,Min是指像素数量不为0的第一个色阶。

对比度拉伸的公式:C = (Level - Min) * Scale = (Level - Min) * 255 / (255-Min)

图C均衡化之后的灰度值分别是128、212、255,为了精确,我们使用保留2位小数的形式(127.50、212.42、255.00)来进行对比度拉伸的计算。

Min = 127.50 '均衡化之后的最小值
Scale = 255/(255-Min) = 2(127.50-Min)*Scale = 0*2 = 0
(212.42-Min)*Scale = 84.92*2 = 170
(255.00-Min)*Scale = 127.5*2 = 255'新的映射表:
50  -> 0
100 -> 170
200 -> 255

经典算法和Photoshop算法的直方图比较。

彩色算法

彩色的直方图均衡化其实就是对图像某个或多个颜色通道进行灰度直方图均衡化运算,常见的有以下几种方法:

  1. 统计所有RGB颜色通道的直方图的数据并做均衡化运算,然后根据均衡化所得的映射表分别替换R、G、B通道颜色值。

  2. 分别统计R、G、B颜色通道的直方图的数据并做均衡化运算,然后根据R、G、B的映射表分别替换R、G、B通道颜色值。

  3. 用亮度公式或求RGB的平均值的方式计算亮度通道,然后统计亮度通道的直方图的数据并做均衡化运算,然后根据映射表分别替换R、G、B通道颜色值。

Photoshop用的是第一种方法。

总结

直方图均衡化是灰度变换的一个重要应用,它高效且易于实现,广泛应用于图像增强处理中。图像的像素灰度变化是随机的,直方图的图形高低不齐,直方图均衡化就是用一定的算法使直方图大致平和。

均衡化处理后的图象只能是近似均匀分布。均衡化图象的动态范围扩大了,但其本质是扩大了量化间隔,而量化级别反而减少了,因此,原来灰度不同的象素经处理后可能变的相同,形成了一片的相同灰度的区域,各区域之间有明显的边界,从而出现了伪轮廓。

如果原始图像对比度本来就很高,如果再均衡化则灰度调和,对比度降低。在泛白缓和的图像中,均衡化会合并一些象素灰度,从而增大对比度。均衡化后的图片如果再对其均衡化,则图像不会有任何变化。

灰度直方图均衡化的算法,简单地说,就是把直方图的每个灰度级进行归一化处理,求每种灰度的累积分布,得到一个映射的灰度映射表,然后根据相应的灰度值来修正原图中的每个像素。

经典的直方图均衡化算法可能存在以下一些不足:

  1. 输出图像的实际灰度变化范围很难达到图像格式所允许的最大灰度变化范围。
  2. 输出图像的灰度分布直方图虽然接近均匀分布, 但其值与理想值1/n仍有可能存在较大的差异, 并非是最佳值。
  3. 输出图像的灰度级有可能被过多地合并。由于灰度的吞噬也易造成图像信息的丢失。

为此人们提出了许多改进的直方图均衡算法,详细内容请参阅本文末尾提供的参考资料。

基于上述编程思想,用MATLAB实现的算法如下:

%直方图均衡化
I0 = imread('lena.jpg');
I = rgb2gray(I0) %二值化
[height,width]=size(I);
figure
subplot(221)
imshow(I)%显示原始图像
subplot(222)
imhist(I)%显示原始图像直方图%根据像素灰度统计;
NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级(初始化数目为0)
for i = 1:heightfor j = 1:widthNumPixel(I(i,j)+1)=NumPixel(I(i,j)+1)+1;%对应灰度值像素点数量加一end
end%计算灰度分布密度
ProbPixel = zeros(1,256);
for i = 1:256ProbPixel(i) = NumPixel(i)/(height*width*1.0);
end%计算累计直方图分布(“离散求累积和,连续求积分”)
for i = 1:256if i == 1Cumupixel(i) = ProbPixel(i);elseCumupixel(i)=Cumupixel(i-1)+ProbPixel(i);end
end%累计分布取整
for i = 1:256Cumupixel(i) = uint8(255.0*Cumupixel(i)+0.5);
end
%对灰度值进行映射(均衡化)
for i = 1:heightfor j = 1:widthI(i,j)=Cumupixel(I(i,j));end
endsubplot(223)
imshow(I)%显示直方图均衡化后的图像
subplot(224)
imhist(I)%显示直方图均衡化后的图像的直方图

实现效果如下:

直方图均衡化算法原理详解相关推荐

  1. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  2. TOPSIS(逼近理想解)算法原理详解与代码实现

    写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...

  3. 离线强化学习(Offline RL)系列3: (算法篇)策略约束 - BRAC算法原理详解与实现(经验篇)

    论文原文:[Yifan Wu, George Tucker, Ofir Nachum: "Behavior Regularized Offline Reinforcement Learnin ...

  4. 一致性哈希算法原理详解

    一.普通 hash 算法 (取模算法): 在了解一致性哈希算法之前,我们先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那 ...

  5. DES加解密算法原理详解与实现

    [DES密码编写] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 64 (3) softwa ...

  6. CORDIC算法原理详解及其Verilog实现

    CORDIC算法原理详解及其Verilog实现 本文的verilog代码 链接:https://pan.baidu.com/s/1GGbRjxO5CxoIODQAg1l6Lw 提取码:jo0h *本文 ...

  7. 直方图均衡化算法原理及bins的理解

    原理部分转载于:直方图均衡化算法原理与实现 bin的理解和直观展示见 part2 part1 直方图均衡化算法原理 我们知道提高图像对比度的变换函数f(x)需要满足以下条件: f(x)在0<=x ...

  8. 机器学习,深度学习基础算法原理详解(图的搜索、交叉验证、PAC框架、VC-维(持续更新))

    机器学习,深度学习基础算法原理详解(图的搜索.交叉验证.PAC框架.VC-维.支持向量机.核方法(持续更新)) 机器学习,深度学习基础算法原理详解(数据结构部分(持续更新)) 文章目录 1. 图的搜索 ...

  9. XGBoost核心算法原理详解

    XGBoost算法原理详解 前言 boosting和bagging的区别 bagging boosting 提升树-基于残差的训练 学习路径 构造目标函数 Additive Training(叠加式的 ...

最新文章

  1. Nagios+pnp4nagios+rrdtool 安装配置为nagios添加自定义插件(三)
  2. Android快速阅读依赖的代码,Java Android快速阅读完整文件
  3. COM原理与应用之COM的实现
  4. HDU 1724 Ellipse ——Simpson积分
  5. .net中流的概念!
  6. 国内外独立IP行情及网站用独立IP优势面面观
  7. 想了解表格问答,我们先看看TA的前世
  8. python全栈开发-Day11 迭代器、生成器、面向过程编程
  9. JAVA→封装类Wrapper、字符串String及其方法、==与equals()、正则表达式、StringBuilder与StringBuffer、内嵌类
  10. C++ 迭代器是指针吗
  11. 如何对CPU过载进行排查
  12. c 字符输入与验证,毁人不倦
  13. 超级表格终于上线「文件转让」功能!文件调动容易解决!
  14. 使用U盘安装windows系统时提示找不到任何设备驱动程序
  15. 一个简单的圆形图片实现
  16. 想必这篇秋招面试贴会帮助你
  17. 大厂面经系列 | 前端 | 美团,字节,京东,顺丰,携程 等题目分享
  18. 常用超低阻值采样电阻阻值一览表
  19. Interpretability Beyond Feature Attribution: Quantitative Testing with Concept Activation Vectors
  20. 快速入门ESP32的硬件设计原理以及典型应用案例UART串口转WIFI智能硬件,以及ESP32-Lyra(智能音频台)设计方案。

热门文章

  1. 微信小程序获取小程序版本号与服务器不符,微信小程序版本号比较
  2. 这些年过上幸福生活的程序员(中篇)
  3. http 请求包含哪几个部分,分别有何作用?
  4. html获取cookie数据,cookies数据是什么意思?
  5. 由微软裁员产生的随想
  6. 要如何图片文字识别翻译?这些软件能帮你
  7. 海报设计如何做好文案超多的海报
  8. 加油,打工人~杨斯维特珍视您的每一滴汗水!
  9. python 峰_python-如何在具有多个峰的数据集中查找FWH...
  10. 检讨书应该怎么写,我来做个示范