【数字图像处理】直方图均衡化详解及编程实现

2023-05-16

 直方图均衡化的英文名称是Histogram Equalization.
  图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
  直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
  缺点:
  1)变换后图像的灰度级减少,某些细节消失;
  2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
  直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
  这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
  这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景杂讯的对比度并且降低有用信号的对比度。
  直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。在灰度直方图均衡化处理中对图像的映射函数可定义为:g = EQ (f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):
  (1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。
  (2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致

性。
  累积分布函数(cumulative distribution function,CDF)即可以满足上述两个条件,并且通过该函数可以完成将原图像f的分布转换成g的均匀分布。此时的直方图均衡化映射函数为:
  gk = EQ(fk) = (ni/n) = pf(fi) ,
  (k=0,1,2,……,L-1)
  上述求和区间为0到k,根据该方程可以由源图像的各像素灰度值直接得到直方图均衡化后各像素的灰度值。在实际处理变换时,一般先对原始图像的灰度情况进行统计分析,并计算出原始直方图分布,然后根据计算出的累计直方图分布求出fk到gk的灰度映射关系。在重复上述步骤得到源图像所有灰度级到目标图像灰度级的映射关系后,按照这个映射关系对源图像各点像素进行灰度转换,即可完成对源图的直方图均衡化。

关于编程实现,同样是不调用matlab库函数,自己编程实现。这样可以更深刻地理解直方图均衡化技术,提高编程能力。

实现代码(matlab):

%直方图均衡化
I = imread('rice.png');
[height,width] = size(I);
figure
subplot(221)
imshow(I)%显示原始图像
subplot(222)
imhist(I)%显示原始图像直方图

%进行像素灰度统计;
NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级
for i = 1:height
    for j = 1: width
        NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一
    end
end
%计算灰度分布密度
ProbPixel = zeros(1,256);
for i = 1:256
    ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
end
%计算累计直方图分布
CumuPixel = zeros(1,256);
for i = 1:256
    if i == 1
        CumuPixel(i) = ProbPixel(i);
    else
        CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);
    end
end
%累计分布取整
CumuPixel = uint8(255 .* CumuPixel + 0.5);
%对灰度值进行映射(均衡化)
for i = 1:height
    for j = 1: width
        I(i,j) = CumuPixel(I(i,j));
    end
end

subplot(223)
imshow(I)%显示原始图像
subplot(224)
imhist(I)%显示原始图像直方图


运行结果:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数字图像处理】直方图均衡化详解及编程实现 的相关文章

随机推荐

  • KEIL下载键变灰色,ST-link无法下载程序

    昨天在调试板子时 xff0c ST LINK下载还是好好的 xff0c 今天开始调试程序 xff0c 突然发现 xff0c KEIL的下载键变成了灰色 xff0c 无法下载 xff0c 如下 xff1a 后面仔细核对了KEIL的设置 xff
  • C++编程中常遇到的问题

    1 路径中不能存在空格 2 for等循环结构中 xff0c 如果判断条件的变量是size t或者unsigned时 xff0c 最好不要采用 i 来递减变量 xff0c 因为这两种类型没有负数 3 引用的引用不可用 xff1a int am
  • keil 采用 makefile 实现编译

    1 说明 由于keil 软件需要收费 xff0c 故有许多公司或者个人希望能够使用makefile 实现编译功能 如此一来 xff0c 就可以脱离了keil 公司的限制 xff0c 自由开发 2 开发环境 xff08 1 xff09 win
  • ROS常用消息

    1 sensor msgs sensor msgs是存储传感器常用消息数据message的包 xff0c 提供各种消息数据message的转换方法并定义了常用传感器使用的消息类型message xff0c 如相机 激光扫描测距仪等 xff1
  • .net7 通过 JsonTranscoding 实现 gRPC 与 Web API 一鱼两吃

    目标 在一个网站内 xff0c 用一套proto即提供gPRC 调用 xff0c 又提供 Web API 调用 实现方法 根据微软官方James Newton King xff08 Newtonsoft json 作者 xff09 的文章
  • 滑模控制程序及Simulink仿真

    最近在看论文 xff0c 不太懂滑模控制是个什么东西 xff0c 便开始学习 使用了这篇文章的代码进行实现 https blog csdn net sinat 38887014 article details 103115218 不过这篇文
  • 飞行器设计大作业

    防空导弹主级燃料相对质量因数计算 问题描述 问题解答 详细实验报告及代码见链接 xff1a 飞行器设计大作业 MATLAB运行结果如下图所示
  • c++编程时为什么老是出现cout未定义

    include lt iostream gt using namespace std 加上这句 cout输出流类声明和定义都在iostream之中 对于非标准C 43 43 而言是iostream h 其名字位于std空间 xff0c 对于
  • webApp优化心得

    webapp性能优化 本文中提到的app前端采用的技术栈是Vue全家桶 43 原生js http请求优化 xff1a 场景1 xff1a 当用户操作过快时 xff0c 页面之间跳转时间缩短 xff0c 在网络状态不可控的情况下 xff0c
  • Win10 ctrl快捷键的全称

    Win10平台中 xff0c 以下快捷键在文本编辑器中通常有类似的作用 xff1a ctrl 的全称是 control xff0c 控制 ctrl 43 全称功能AAll全选CCopy复制选中的文本FFind在文本中查找指定的字符串NNew
  • 集成测试(自顶向下,自底向上,三明治)

    文章目录 集成测试 Integration test 集成测试方法和策略非渐增式集成渐增式集成 自顶向下集成自底向上集成三明治集成 集成测试 Integration test 也叫组装测试或联合测试 xff0c 是在单元测试的基础上 xff
  • FreeRTOS阅读记录-task相关

    使用FreeRTOS也很长时间了 xff0c 断断续续看过 xff0c 现在记录 xff0c 流程写出来不难 xff0c 难的是进行高度简洁的总结 在学校时 xff0c 看过UCOS II的代码 xff0c 由于版权问题 xff0c 不能使
  • DIY制作示波器的超详细教程:(一)我不是为了做一个示波器

    讲一个故事 xff1a 今年九月 xff0c 一个新学期的开始 xff0c 课很少 我是一个闲不住的人 xff0c 这样的日子很难熬 xff0c 想去电子市场逛逛 xff0c 但学校离市区有三十 多公里路 xff0c 终于无聊到周末了 和平
  • Mysql取2位小数,加百分号,结果加序号

    1 取2位小数 方式一 xff1a select truncate data total 2 实际使用中发现丢失精度 方式二 xff1a select convert data total decimal 10 2 推荐此方法 xff0c
  • 从入门到进阶,JAVA书籍的最佳阅读顺序!

    本文首发于知乎 xff0c 已获得1000 43 赞和收藏 原文链接 xff1a https www zhihu com question 269505829 answer 1791006152 先介绍下本人的情况 xff0c 希望对大家学
  • 设计数据密集型应用-C5-主从架构及同步延迟问题

    本文是 设计数据密集型应用 第5章学习笔记 什么是Replication Replication是在多台机器上维护的相同的数据 xff0c 即副本 保存副本的原因有以下几种 xff1a 减小延迟 xff1a 使得地理位置上数据离访问者更近
  • 第一条Pulsar消息发送

    什么是Pulsar pulsar是一个多租户 高性能server to srever消息解决方案 xff0c 最初由雅虎开发 xff0c 现在由apache维护 Pulsar的核心特性 xff1a 多集群云原生支持低延迟 良好的伸缩性多语言
  • 2014找工作总结-机会往往留给有准备的人

    转发请注明出处 xff1a 2014找工作总结 机会往往留给有准备的人 计算机专业同学的充电站 CSDN博客 其实我的求职过程在十一之前就已经结束了 xff0c 总体讲比较顺利 参加面试的几家公司基本都拿到了offer xff0c 分别是阿
  • 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现

    通过我这些天用C 43 43 读写bmp图像的经历 xff0c 摸索再摸索 xff0c 终于对bmp文件的结构 操作有了一定的了解 xff0c 下面就大概介绍bmp图片纯C 43 43 的读取 旋转和保存的实现过程 要用C 43 43 读取
  • 【数字图像处理】直方图均衡化详解及编程实现

    直方图均衡化的英文名称是Histogram Equalization 图像对比度增强的方法可以分成两类 一类是直接对比度增强方法 另一类是间接对比度增强方法 直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法 直方图拉伸是通过对比度拉