【opencv学习笔记】024之直方图均衡化

一、什么是直方图(histogram)

        直方图(Histogram)又称质量分布图。是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。

        直方图是数值数据分布的精确图形表示。 这是一个连续变量(定量变量)的概率分布的估计,并且被卡尔·皮尔逊(Karl Pearson)首先引入。它是一种条形图。 为了构建直方图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 这些值通常被指定为连续的,不重叠的变量间隔。 间隔必须相邻,并且通常是(但不是必须的)相等的大小。

        直方图也可以被归一化以显示“相对”频率。 然后,它显示了属于几个类别中的每个案例的比例,其高度等于1。
         直方图的常见作用有以下三点:
        (1)显示质量波

动的状态;        (2)较直观地传递有关过程质量状况的信息;
        (3)通过研究质量波动状况之后,就能掌握过程的状况,从而确定在什么地方集中力量进行质量改进工作。
如果想对数学的直方图概念有更深刻的了解,可以查阅 百度百科(你点我啊,点我,点我)关于直方图的描述。

二、什么是图像直方图

        图像直方图,是指对整个图像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图。反映了图像灰度的分布情况,是图像的统计学特征。比如下面这张图后面的就是前面图形的图像直方图。


三、什么是直方图均衡化

        直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果。

    图1所示就是直方图均衡化, 即将随机分布的图像直方图修改成均匀分布的直方图。基本思想是对原始图像的像素灰度做某种映射变换, 使变换后图像灰度的概率密度呈均匀分布。这就意味着图像灰度的动态范围得到了增加, 提高了图像的对比度。

clip_image001

        这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。

        直方图均衡技术将原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布, 由于其算法简单, 无需借助外来因素的参数设置,可以自成系统的运行, 有效地增强图像对比度, 是一种常用的图像增强方法. 一直以来, 直方图均衡技术受到各个领域的重视, 比如在消费类电子产品邻域, 在均衡图像的同时希望保持图像的亮度信息。

四、均衡化原理

        基本思想:把原始图的直方图变换为均匀分布的形式,这样就增加了像素灰度值的动态 范围,从而达到增强图像整体对比度的效果。

        原理:使用的方法是灰度级变换:s = T(r) 0≤r≤1

        其中变量r 代表图像中像素灰度级。对灰度级进行归一化处理, 则0≤r≤1, 其中r= 0表示黑, r= 1表示白。对于一幅给定的图像来说, 每个像素值在[ 0,1] 的灰度级是随机的。

        T(r)满足下列两个条件:

        (1)T(r)在区间0≤r≤1中为单值且单调递增   (保证原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列次序)

        (2)当0≤r≤1时,0≤T(r) ≤1   (保证变换前后灰度值动态范围的一致性)

         Pr(r)是r的概率密度函数,Ps(s)是s的概率密度函数,用来表示图像灰度级的分布。Pr(r)和T(r)已知,且T-1(s) 满足上述条件(1),所以有

        已知一种重要的变换函数:

         

        关于上限的定积分的导数就是该上限的积分值 (莱布尼茨准则)

        对于离散值:

        其中r是第k个灰度级,k = 0,1,2,…,L-1.

          nk是图像中灰度级为rk的像素个数.

          n是图像中像素的总数.

        已知变换函数的离散形式为:

        sk称作直方图均衡化 将输入图像中灰度级为rk(横坐标)的像素映射 到输出图像中灰度级为sk (横坐标)的对应像素得到.

五、API

equalizeHist   (   
		InputArray      src,		//8-bit单通道 输入图像
		OutputArray     dst		//目标图像,与原图像有相同的尺寸和类型。
    ) 

API很简单,只是需要先做灰度处理。

#define INPUT_TITLE "input image"
#define OUTPUT_TITLE "直方图均衡化"

#include<iostream>
#include<opencv2\opencv.hpp>

using namespace std;
using namespace cv;

int main() {
	Mat img, src;
	src = imread("D:/image/equalizeHist.jpg");
	if (!src.data)
	{
		cout << "ERROR : could not load image.";
		return -1;
	}
	cvtColor(src, img,CV_BGR2GRAY);
	equalizeHist(img, img);
	namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE);
	namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);

	imshow(INPUT_TITLE, src);
	imshow(OUTPUT_TITLE, img);



	waitKey(0);
	return 0;
}



猜你喜欢

转载自blog.csdn.net/shuiyixin/article/details/80001756
今日推荐