【fishing-pan:https://blog.csdn.net/u013921430转载请注明出处】

前言

  直方图均衡化是最基础的图像处理方法之一,也是本人接触图像处理时最先接触到的算法。算法很简单,但是却不得不说非常的巧妙。本文将从方法的数学基础出发讲解直方图均衡化背后的数学原理,并提供matlab实现代码。

直方图均衡化

  图像灰度分布的直方图,顾名思义,就是图像中灰度值数目统计的直方图。直方图均衡化处理是将原图的灰度分布直方图中灰度分布密集的部分扩散成在全局范围内的均匀分布。这样就增加了像素灰度值的动态范围,从而达到增强图像整体对比度的效果。直方图均衡化是一种灰度变换的方法,其对图像进行非线性的拉伸,重新分配像素值。如下图所示;


 


图1 左图是均衡化之前的图像灰度分布直方图,右图是理想情况下均衡化之后的灰度分布直方图。

原理

  图像变换是需要找到一种合适的变换关系的,直方图均衡化也不例外。为了方便表示,我们假设,图像灰度区间为[0,1];对于区间内的任意像素值,我们需要进行如下变换。

S=T(r),0≤r≤1;S=T(r),0≤r≤1;

S=T\left ( r \right ),0\leq r\leq 1;
  上述式子应该满足两个条件;
    1. 在区间[0,1]内, T(r)T(r)T\left ( r \right )单调递增;
    2. 应该有 0≤T(r)≤10≤T(r)≤10\leq T\left ( r \right )\leq 1。
  同样的,反变换 r=T−1(s)r=T−1(s)r=T^{-1}\left ( s \right ),也应该服从上面两个条件。条件1 保证了保证原图各灰度级在变换后仍保持从黑 到白(或从白到黑)的排列次序。条件2 保证变换前后灰度值动态范围的一致性。
  假设原图r概率密度为 Pr(r)Pr(r)P_{r}\left ( r \right ),变换后的概率密度为 Ps(s)Ps(s)P_{s}\left ( s \right )。由于图像灰度总值时不变的,那么就有以下公式;

∫r0Pr(r)dr=∫s0Ps(s)ds;∫0rPr(r)dr=∫0sPs(s)ds;

\int_{0}^{r}P_{r}\left ( r \right ){\mathrm{d} r}=\int_{0}^{s}P_{s}\left ( s \right ){\mathrm{d} s};
  又由图1中的公式可知

Ps(s)=1;Ps(s)=1;

P_{s}\left ( s \right )=1;
  则带入上述式子中,有

∫r0Pr(r)dr=∫s0Ps(s)ds=∫s01ds=s=T(r);∫0rPr(r)dr=∫0sPs(s)ds=∫0s1ds=s=T(r);

\int_{0}^{r}P_{r}\left ( r \right ){\mathrm{d} r}=\int_{0}^{s}P_{s}\left ( s \right ){\mathrm{d} s}=\int_{0}^{s}1{\mathrm{d} s}=s=T\left ( r \right );
  所以,我们所要找的变换关系就找到了。

∫r0Pr(r)dr=T(r);∫0rPr(r)dr=T(r);

\int_{0}^{r}P_{r}\left ( r \right ){\mathrm{d} r}=T\left ( r \right );
  这个式子说明了,变换后的图像的灰度值时根据原图中该点的灰度值的概率分布函数得到的。

离散图像中的变换关系

  在离散的图像中,假设图像总共有N个像素点,总共有L个像素级。图像中灰度级为k的像素点的数目为nknkn_{k}。则有如下关系;

Pr(rk)=nkN;Pr(rk)=nkN;

P_{r}\left ( r_{k} \right )=\frac{n_{k}}{N};
  则函数 T(r)T(r)T\left ( r \right )可以表示成如下式子;

T(rk)=∑j=0kPr(rj)=∑j=0knkN0≤rj≤1,k=0,1⋯L−1;T(rk)=∑j=0kPr(rj)=∑j=0knkN0≤rj≤1,k=0,1⋯L−1;

T\left ( r^{k} \right )=\sum_{j=0}^{k}P_{r}\left ( r_{j} \right )=\sum_{j=0}^{k}\frac{n_{k}}{N}\: \: \: \: \: \: \: \: 0\leq r_{j}\leq 1,k=0,1\cdots L-1;


 

图2 离散的图像的均衡化

  假如有一张八位的图像,图像中一点的灰度为kk{k},那么在经过变换后,灰度应该为;

s(i,j)=255∗∑j=0knkNs(i,j)=255∗∑j=0knkN

s\left ( i,j \right )=255*\sum_{j=0}^{k}\frac{n_{k}}{N}

代码

  下面提供自己编写的代码。

利用Matlab实现的代码

clear all;
clc
I=imread('lena.jpg');           %读入图像;
J=rgb2gray(I);                  %彩色图转换成灰度图;
figure,imshow(J);
title('原始图');
[m n]=size(J);
pro=zeros(1,256);
sum=zeros(1,256);for i=1:mfor j=1:npro(J(i,j)+1)=pro(J(i,j)+1)+1;      end
endsum(1)=pro(1);for g=2:256sum(g)=pro(g)+sum(g-1);
endnewim=zeros(m,n);
sum=sum.*255/(m*n);      %概率分布函数for i=1:mfor j=1:nnewim(i,j) =uint8(sum(J(i,j)+1));if newim(i,j)>255newim(i,j)=255; %重新分布灰度值end        end
endfigure,imshow(uint8(newim) );
title('自己编写的直方图均衡化处理结果');figure,histeq(J);
title('Matlab自带的直方图均衡化处理结果');

计算结果



 


 

基于OpenCV的代码

/*-------------------------------------------------------------------
OpenCV测试函数。 2018年4月10日,潘正宇功能:自己编写直方图均衡化
------------------------------------------------------------------*/#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;void Histeq(Mat &Scr,Mat &Dst)
{int Col = Scr.cols;int Row = Scr.rows;int Size = Col*Row;//int *Hist = new int[Size];Mat pdFunc = Mat::zeros(1, 256, CV_32FC1);       //概率密度直方图;for (int r = 0; r < Row; r++){for (int c = 0; c < Col; c++){           pdFunc.at<float>(Scr.at<uchar>(r, c)) = pdFunc.at<float>(Scr.at<uchar>(r, c)) + 1;    //统计每个点对应像素值的数目}}Mat PDFunc = Mat::zeros(1, 256, CV_32FC1);       //概率分布直方图;PDFunc.at<float>(0) = pdFunc.at<float>(0);for (int i = 1; i < 256; i++){PDFunc.at<float>(i) = PDFunc.at<float>(i - 1) + pdFunc.at<float>(i);int  s = PDFunc.at<float>(i);}//PDFunc = PDFunc / Size;for (int r = 0; r < Row; r++){for (int c = 0; c < Col; c++){int s= 255 * PDFunc.at<float>(Scr.at<uchar>(r, c))/Size;if (s < 0){ s = 0; }if (s > 255){ s = 255; }Dst.at<uchar>(r, c) = (uchar)s;}}}int main()
{Mat ScrImage = imread("C:\\Users\\most_pan\\Desktop\\lena.jpg",0);    //以灰度图的形式读入一张图imshow("原始图", ScrImage);Mat DstImage = ScrImage.clone();Histeq(ScrImage,DstImage);imshow("直方图均衡的结果", DstImage);waitKey(0);return 0;
}

计算结果


 


 

已完。。

【图像处理】直方图均衡化(附带Matlab及OpenCV3自编程实现代码)相关推荐

  1. 数字图像处理 直方图均衡化 MATLAB实验

    一.原理 直方图均衡化是通过对原图像进行某种变换使原图像的灰度直方图修正为均匀的直方图的一种方法. 二.步骤 ①读入原图像huafen.jpg,并显示图像及其直方图: ②对图像进行直方图均衡化处理,并 ...

  2. 灰度直方图及直方图均衡化的MATLAB实现

    文章和代码以及样例图片等相关资源,已经归档至[Github仓库:digital-image-processing-matlab]或者公众号[AIShareLab]回复 数字图像处理 也可获取. 文章目 ...

  3. 直方图均衡化(Matlab实现)

    直方图均衡化定义:通过某种灰度映射使输入图像转换为在每一灰度级上都有近似相同的像素点的输出图像(即输出的直方图是均匀的). Matlab图像处理工具箱提供了用于直方图均衡化的函数histeq(),调用 ...

  4. [图像处理] 直方图均衡化原理 - 数学推导

    直方图均衡化 效果 代码 import cv2 as cv import numpy as np import matplotlib.pyplot as pltsrc = cv.imread(&quo ...

  5. 图像处理-直方图均衡化

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-11.html 概念 在统计学中,直方图(英语:Histogra ...

  6. 详细解析图像处理 直方图均衡化计算

    什么是直方图均衡化 看一个图了解一下什么是直方图均衡化: 第一个图灰度都集中在左边,整体图像较暗 第二个图灰度都集中在右边,整体图像较亮 第三个图灰度都集中在中间,整体图像适中,但是雾蒙蒙的并不清晰 ...

  7. 图像直方图均衡化c语言程序,数字图像处理——直方图均衡化

    1.相关了解 直方图均衡化又称为直方图平坦化.直方图均衡化的基本思想是将原始图像的不均衡的直方图变换为均匀分布的形式.即将输入图像转化为在每一灰度级上都有相同的像素点数(即输出的直方图是平坦的,其分布 ...

  8. 图像处理 直方图均衡化

    直方图均衡化的作用和优势: 作用:这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候.通过这种方法,亮度可以更好地在直方图上分布.这样就可以用于增强局部的对比度而不 ...

  9. 图像处理直方图均衡化

    直方图均衡化 简介 直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法,其主要思想是将一副图像的直方图分布变成近似均匀分布,从而增强 ...

最新文章

  1. axture动画原型制作_Axure制作原型-基础操作
  2. c调用python脚本 效率,尝试用C调用Python脚本#
  3. Linux的工作队列work queue和延时工作队列
  4. java与自动化的应用实例_自动化测试中java多线程的使用实例
  5. 视觉SLAM十四讲_4-相机模型和非线性优化
  6. 寻找节点d=n的节点算法
  7. IDEA 个人私藏插件
  8. 华为交换机s2700怎么重置_华为s2700交换机初次使用常用配置命令
  9. 中华活页文选杂志中华活页文选杂志社中华活页文选编辑部2022年第8期目录
  10. [kernel 启动流程] 前篇——vmlinux.lds分析
  11. EE308-Lab8-AlphaSprint-Day6
  12. 依照测试用例分类(按功能)的结果生成对应的universe文件
  13. 一文读懂Android View事件分发机制
  14. Windows脚本 - Bat批处理命令使用教程
  15. BS开发(浏览器和服务器开发)
  16. 香港计算机博士申请 live,香港理工大学-EngD博士offer
  17. qt linux qm,QM 文件扩展名: 它是什么以及如何打开它?
  18. Jenkins 构建定时任务后不触发构建
  19. Java开发规范整理
  20. 使用 MyBatis 实体类里的 Double 类型查询不到值

热门文章

  1. partial is not defined的解决办法
  2. Android4.0/Android4.1 WifiStateMachine状态机结构图
  3. asp.net弹出alert提示框
  4. JavaScript导出图片和数据到Excel
  5. Docker快速搭建Tuleap项目管理平台
  6. 银行业务队列简单模拟(队列queue)
  7. JavaScript异步编程【上】 -- 同步和异步、事件循环(EventLoop)、微任务和宏任务、回调函数
  8. javascript闭包_JavaScript闭包基本指南
  9. ai端到端_如何使用行为树构建端到端的对话式AI系统
  10. git团队如何提交_如何使您的提交消息很棒并保持团队快乐