昨天说了,今天要好好的来解释说明一下直方图均衡化。并且通过不调用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代码实现的更多相关文章

  1. 直方图均衡化及matlab实现

    在处理图像时,偶尔会碰到图像的灰度级别集中在某个小范围内的问题,这时候图像很难看清楚.比如下图: 它的灰度级别,我们利用一个直方图可以看出来(横坐标从0到255,表示灰度级别,纵坐标表示每个灰度级别的 ...

  2. 彩色图像的直方图均衡化matlab代码

    彩色图像的直方图均衡化 - YangYudong2014的专栏 - CSDN博客 http://blog.csdn.net/yangyudong2014/article/details/4051503 ...

  3. matlab 直方图均衡化

    原理: 直方图均衡化首先是一种灰度级变换的方法: 原来的灰度范围[r0,rk]变换到[s0,sk]变换函数为:s=T(r); 为便于实现,可以用查找表(look-up table)的方式存储,即:原始 ...

  4. 图像处理 Matlab实现线性点运算、非线性点运算、点运算与直方图、直方图均衡化

    今天,我们学习了直方图.于是乎,回来我就用matlab代码实现一下.昨天受到道路检测老师课上一个内容的影响(对于道路裂缝的检测,我突发奇想,如果对于道路图像进行操作,是否能够让裂缝与道路分离,使得图像 ...

  5. 直方图均衡化与直方图规定化的MATLAB实现

    目录 1.直方图均衡化 2.直方图规定化 @ 1.直方图均衡化 对图像进行非线性拉伸,重新分配图像像元值,使一定灰度范围内像元值的数量大致相等就是直方图的均衡化.原来直方图中间的峰顶部分对比度得到增强 ...

  6. matlab 直方图均衡化(含rgb)

    步骤: 统计原图像素每个像素的个数 统计原图像<每个灰度级的像素的累积个数 家里灰度级得映射规则 将原图每个像素点的灰度映射到新图 代码: clear all I=imread('1.jpg') ...

  7. Matlab实现直方图均衡化

    G=imread('aini555.jpg'); I=rgb2gray(G); J=histeq(I); %直方图均衡化,这一个函数就可以做到均衡化的效果 figure, subplot(),imsh ...

  8. MATLAB - 练习程序,直方图均衡化

    直方图均衡化的作用是图像增强. 有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布. 第一个问题.均衡化过程中,必须要保证两个条件:①像素无论怎么映射, ...

  9. 将labelme 生成的.json文件进行可视化的代码+label.png 对比度处理的matlab代码

    labelme_to_dataset 指令的代码实现: show.py文件 #!E:\Anaconda3\python.exe import argparse import json import o ...

随机推荐

  1. mongoVUE破解与配置、Mongodb数据库安装

    一.mongoVUE 1.5.3破解: 1) 开始-运行-regedit-搜索:B1159E65-821C3-21C5-CE21-34A484D54444 2.) 然后把1,2,3项数值删除,然后重新 ...

  2. 自动化脚本测试,postman使用沉淀

    // 服务器地址 var server = 'XXXXXXXXXXXX'; //秘钥Key var secretKey = 'XXXXXXXXXXXX'; //获取当前时间 function crea ...

  3. kubernetes in action - Services

    问题,如何将Pod所提供的功能提供给别人用?微服务,是服务,所以关键要把服务提供出去 直接把pod的静态ip提供给用户用,这个会有很多问题,比如failover,扩容,负载均衡等 所以需要servic ...

  4. Linux服务器在SSH客户端如何实现免密登录

    一.SSH客户端Setting 配置 key ,  创建生成公钥导出文件. 二.服务器 master 上生成密钥 通过执行命令 ssh-keygen -t rsa 来生成我们需要的密钥. ssh-ke ...

  5. C与C++相互调用

    C++编译器可以兼容并编译C语言,但优先使用C++编译方式,extern关键字让C++编译器使用C语言编译方式编译. extern "C" { // c 编译器编译的代码 } C+ ...

  6. 当使用eclipse将项目部署到Tomcat时,提示Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modul

    原因: 此版本选择过高.当出现此错误时,直接对项目可能无法进行修改.可以通过修改项目的配置文件来达到目的. \workspace\项目名称\.settings\org.eclipse.wst.comm ...

  7. python pandas库的基本内容

    pandas主要为数据预处理 DataFrame import pandas food_info = pandas.read_csv("路径")  #绝对路径和相对路径都可以 ty ...

  8. VS2017 异常 Editor or Editor Extension

    KE遇到的第一个问题 VS 2017 打开文件的时候, 遇到异常 检查 activity_log发现是 Editor or Editor Extension, 解决办法: 安装插件, Clear ME ...

  9. JS 获取最近(前)7天(一周内)和最近(前)3天日期

    //获取最近7天日期 getDay(0);//当天日期 getDay(-7);//7天前日期 //获取最近3天日期 getDay(0);//当天日期 getDay(-3);//3天前日期 functi ...

  10. FB面经prepare: Count the number of Vector

    给一个超级大的排好序的vector [abbcccdddeeee]比如,要求返回[{,a}, {,b}, {,c}, {,d}, {,e}......]复杂度要优于O(N) 分析: 如果是binary ...