当前位置: 首页 > news >正文

数字图像处理---直方图均衡化

直方图均衡化的英文名称是Histogram Equalization. 

  图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
  直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
  缺点: 
  1)变换后图像的灰度级减少,某些细节消失; 
  2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。 
  直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。 
  这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
  这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景杂讯的对比度并且降低有用信号的对比度。

1.连续灰度值

r:待处理图像的灰度。假设r的取值区间[0,L-1], r = 0表示黑色,r = L - 1表示白色。

变换形式: s = T(r);

pr(r)和ps(s)分别表示变量 r 和 s 的概率密度函数(PDF)。

输出灰度变量s的PDF由输入灰度的PDF的变换函数:s = T(r) = (L - 1)∫pr(w)dw.

其中,w是积分的假变量。公式右边是随机变量 r 的累积分布函数(CDF).

新图像中的灰度的PDF是均匀的,ps(s) = 1/(L - 1);

 

2.离散灰度值

pr(rk) = nk/MN,  k = 0,1,2...,L-1

其中,MN是图像中像素的总数,nk是灰度为rk的像素个数。

输出灰度变量s的PDF由输入灰度的PDF的变换函数:sk = T(rk) = ((L - 1)/MN)∑nj,  k = 0,1,2...,L-1.

 

matlab调用自带函数编码实现:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0316(2)(2nd_from_top).tif');
f_enhance = histeq(f);
subplot(221)
imshow(f)
subplot(222)
imshow(f_enhance)
subplot(223)
imhist(f)
subplot(224)
imhist(f_enhance)

 

显示:

 

matlab手动实现:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0316(2)(2nd_from_top).tif');

[height,width] = size(f);
f_enhance = uint8(zeros(height,width));

%统计各灰度数目,共256个灰度级
Num_Pixel = zeros(1,256);
for i = 1:height
for j = 1:width
Num_Pixel(f(i,j) + 1) = Num_Pixel(f(i,j) + 1) + 1;
end
end

%计算灰度分布密度
Prob_Pixel = zeros(1,256);
for i = 1:256
Prob_Pixel(i) = Num_Pixel(i)/ (height * width * 1.0);
end

%计算累计直方图分布
Equalization_Pixel = zeros(1,256);
for i = 1:256
if i ==1
Equalization_Pixel(i) = Prob_Pixel(i);
else
Equalization_Pixel(i) = Equalization_Pixel(i - 1) + Prob_Pixel(i);
end
end

%对灰度值进行映射(均衡化)
pixel_max=255;
pixel_min=0;
for i = 1:height
for j = 1: width
f_enhance(i,j) = Equalization_Pixel(f(i,j)+1)*(pixel_max-pixel_min)+pixel_min;
end
end

subplot(221)
imshow(f)
subplot(222)
imshow(f_enhance)
subplot(223)
imhist(f)
subplot(224)
imhist(f_enhance)

 

显示:

 

上面代码在手动实现时本想调用matlab自带函数求概率分布以及转换后的灰度值,实现过程中发现用以下方法行不通,无法把均衡后的灰度值替换回去,还未解决,不知用以下方法是否有解决办法,希望有老师愿意指导一下,谢谢!

代码:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0316(2)(2nd_from_top).tif');

[m,n] = imhist(f);%进行像素灰度级统计
x = m ./ numel(f);%概率近似

y = zeros(1,256);
for i = 1:256
if i == 1
y(i) =x(i);
else
y(i) =(y(i-1) + x(i));
end
end
y = 255 * y; %直方图均衡化

 

参考资源链接:http://blog.csdn.net/ebowtang/article/details/38236441

 http://blog.csdn.net/zhengxiaoyang995926/article/details/79515411

转载于:https://www.cnblogs.com/MrZheng9511/p/histogram.html

相关文章:

  • Chef在InSpec 2.0增强了云安全的自动化功能
  • Kafka源码分析Consumer
  • cad提供的坐标转换
  • Java锁--Semaphore
  • Win8 Metro(C#)数字图像处理--2.43图像马赛克效果算法
  • PowerDesigner 概念数据模型(CDM)
  • [Contest20180313]灵大会议
  • Windows Developer Day - Adaptive Cards
  • 乘法逆元模板(Orz尧神)
  • 贪吃蛇
  • Logstash教程
  • JS 正则表达式
  • Linux 下修改Tomcat使用的JVM内存大小
  • ie中placeholder字体颜色兼容问题
  • jQuery多媒体播放器插件jQuery Media Plugin
  • @angular/forms 源码解析之双向绑定
  • [NodeJS] 关于Buffer
  • echarts花样作死的坑
  • JavaScript异步流程控制的前世今生
  • spring boot 整合mybatis 无法输出sql的问题
  • spring boot下thymeleaf全局静态变量配置
  • Vue2.x学习三:事件处理生命周期钩子
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 从零开始的无人驾驶 1
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端路由实现-history
  • 悄悄地说一个bug
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 一起参Ember.js讨论、问答社区。
  • 原生js练习题---第五课
  • AI算硅基生命吗,为什么?
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #Java第九次作业--输入输出流和文件操作
  • $ git push -u origin master 推送到远程库出错
  • (windows2012共享文件夹和防火墙设置
  • (笔试题)合法字符串
  • (第61天)多租户架构(CDB/PDB)
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (论文阅读40-45)图像描述1
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (七)理解angular中的module和injector,即依赖注入
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十八)SpringBoot之发送QQ邮件
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)详解PHP处理密码的几种方式
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 材料检测系统崩溃分析
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中的轻量级线程安全
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku