直方图均衡化与Matlab代码实现
昨天说了,今天要好好的来解释说明一下直方图均衡化。并且通过不调用histeq函数来实现直方图的均衡化。
一、直方图均衡化概述
直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果。[1]

根据香农定理关于信息熵的定义:

对于一副图像而言,当每一个灰度值分布更均衡,图像所包含的信息量是越大的;相反,仅仅只有一个灰度值的时候,信息量很少。这个是我们能够想来的比如:纯黑图像包含信息量很少,而其他图像我们可能会看到一些人物、景物。
就效果而言,直方图均衡化使得图像信息量变大,但是不可能会发生较小的灰度值在经过均衡化后变得比原来较大的灰度值更大。这也就意味着,我们通过均衡化后的图所观察到的景物应当与原来图像所观察到的一致,只是颜色层次更清晰,更加具有辨识度。
二、直方图均衡化公式推导
(ps:今天一开始看了好多人的推导都觉得特别乱,思路比较混乱,最后自己沉下心来研究了一下,终于将推导思路理顺了,在下文进行呈现)
现假定原图的直方图-灰度值关系为f(x),则累积灰度直方图应当是F(x),经过均衡化后的直方图-灰度值关系为f(y),其累积灰度直方图应当是F(y)。原灰度值x与后灰度值y之间存在某种映射关系:y=T(x)。

方程两边对y求导:

由于有:

可得:

方程两边积分:

即

对于离散值而言:

三、直方图均衡化Matlab代码实现
clc;
clear;
RGB = imread('2.jpg'); % 读取彩色图
subplot(2,3,1);imshow(RGB);title('彩色图'); fx=rgb2gray(RGB);
subplot(2,3,2);imshow(fx);title('灰度图');
subplot(2,3,3);imhist(fx);title('灰度图'); [R, C] = size(fx); % 统计每个像素值出现次数
count = zeros(1, 256);
for i = 1 : R
for j = 1 : C
count(1, fx(i, j) + 1) = count(1, fx(i, j) + 1) + 1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%一下编写T函数[2]
T = zeros(1, 256);
T = double(T); count = double(count); % 统计每个像素值出现的概率, 得到概率直方图
for i = 1 : 256
T(1, i) = count(1, i) / (R * C);
end % 求累计概率,得到累计直方图
for i = 2 : 256
T(1, i) = T(1, i - 1) + T(1, i);
end % 完善T函数的定义
for i = 1 : 256
T(1, i) = T(1, i) * 255;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 完成每个像素点的映射
fy = double(fx);
for i = 1 : R
for j = 1 : C
fy(i, j) = T(1, fy(i, j) + 1);
end
end % 输出仍然要记得改数据类型
fy = uint8(fy);
subplot(2,3,5);imshow(fy);title('直方图均衡化');
subplot(2,3,6);imhist(fy);title('直方图均衡化');
参考文献:
[1] https://www.cnblogs.com/hustlx/p/5245461.html.
[2] https://blog.csdn.net/acmore_xiong/article/details/53183131.
2019-03-07
22:24:57
直方图均衡化与Matlab代码实现的更多相关文章
- 直方图均衡化及matlab实现
在处理图像时,偶尔会碰到图像的灰度级别集中在某个小范围内的问题,这时候图像很难看清楚.比如下图: 它的灰度级别,我们利用一个直方图可以看出来(横坐标从0到255,表示灰度级别,纵坐标表示每个灰度级别的 ...
- 彩色图像的直方图均衡化matlab代码
彩色图像的直方图均衡化 - YangYudong2014的专栏 - CSDN博客 http://blog.csdn.net/yangyudong2014/article/details/4051503 ...
- matlab 直方图均衡化
原理: 直方图均衡化首先是一种灰度级变换的方法: 原来的灰度范围[r0,rk]变换到[s0,sk]变换函数为:s=T(r); 为便于实现,可以用查找表(look-up table)的方式存储,即:原始 ...
- 图像处理 Matlab实现线性点运算、非线性点运算、点运算与直方图、直方图均衡化
今天,我们学习了直方图.于是乎,回来我就用matlab代码实现一下.昨天受到道路检测老师课上一个内容的影响(对于道路裂缝的检测,我突发奇想,如果对于道路图像进行操作,是否能够让裂缝与道路分离,使得图像 ...
- 直方图均衡化与直方图规定化的MATLAB实现
目录 1.直方图均衡化 2.直方图规定化 @ 1.直方图均衡化 对图像进行非线性拉伸,重新分配图像像元值,使一定灰度范围内像元值的数量大致相等就是直方图的均衡化.原来直方图中间的峰顶部分对比度得到增强 ...
- matlab 直方图均衡化(含rgb)
步骤: 统计原图像素每个像素的个数 统计原图像<每个灰度级的像素的累积个数 家里灰度级得映射规则 将原图每个像素点的灰度映射到新图 代码: clear all I=imread('1.jpg') ...
- Matlab实现直方图均衡化
G=imread('aini555.jpg'); I=rgb2gray(G); J=histeq(I); %直方图均衡化,这一个函数就可以做到均衡化的效果 figure, subplot(),imsh ...
- MATLAB - 练习程序,直方图均衡化
直方图均衡化的作用是图像增强. 有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布. 第一个问题.均衡化过程中,必须要保证两个条件:①像素无论怎么映射, ...
- 将labelme 生成的.json文件进行可视化的代码+label.png 对比度处理的matlab代码
labelme_to_dataset 指令的代码实现: show.py文件 #!E:\Anaconda3\python.exe import argparse import json import o ...
随机推荐
- Collections类
1:一个类对象之间的比较两种方法 1)实现Comparator<String>类并且从写Comparator类中的compare方法, public class A implements ...
- 第二单元电梯调度作业 By Wazaki
figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...
- ROS串口通信
身处机器人行业,不想一直只做低端的单片机控制,老是待在舒适区,所以一直都想学一下ROS系统,但看了几个月资料后,感觉还是云里雾里,似懂非懂,感念似乎都很清楚,但要实际去做,却又感觉无从下手. 于是想先 ...
- 管理npm源命令
nrm ls 查看源镜像 nrm add 自定义名称 源地址 nrm use 自定义名称
- linux 逆向映射
逆向映射用于建立物理内存页和使用该页的进程的对应页表项之间的联系,在换出页时以便更新所有涉及的进程.得到物理页基址后,根据pfn_to_page可以将页框转换为page实例,page实例中的mappi ...
- 使用charles过滤网络请求
1.对网络请求进行过滤,只监控向指定目录服务器上发送的请求 有以下方法: (1)在Structure视图或者Sequence视图的Filter 栏中填入需要过滤出来的关键字(适合临时性封包过滤) 或者 ...
- mac环境使用ATS验证
https://blog.csdn.net/skylin19840101/article/details/53760146 参考的这篇文章,用 /usr/bin/nscurl --ats-diagno ...
- [ML] 数据处理
可以不需要自己开发,使用CloudCompare的分割合并功能实现点云标注(labeling),生成点云训练集数据. (1)首先对点云中的物体进行分割,分割出一个一个的类别. (2)接着删除所有的SF ...
- python 循环 while
count = 1while count <= 5: print("大家好!") count = count + 1 结果:while 可以进行循环, count 表示计数, ...
- SpringMVC和Struts2的区别及优势
1.SpringMVC和Struts2的区别比较 1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方 ...