7.5直方图均衡化

        马上就要开会了,小编刚接触opencv就要给小伙伴们讲直方图均衡化了,有点小紧张,还是先做个笔记吧。

        首先,直方图是什么?

        直方图是图像中像素强度分布的图形表达方式,它统计了每一个强度值所具有的像素个数,描述了图像灰度值。

        像素:一幅图像是由许多的小格子组成的,这些小格子就是像素点,像素点组成像素。

        像素强度:0~255之间的值。在灰度图像中,它是图像的灰度值。

       

        如图所示,横坐标的值即像素强度从0到255,从暗到亮,左暗右亮,左边用于描述图像的暗度,右边用于描述图像的亮度。纵坐标表示像素量,峰值高则像素量多,峰值低则像素量少。

        图上的直方图说明,左边图像中暗的和亮的像素比较少,灰的像素比较多。

        再给大家举两个例子:

        

        

        然后,直方图均衡化是什么?

        https://blog.csdn.net/zhulf0804/article/details/52770613

        直方图均衡化是通过拉伸像素强度分布范围来增强图像对比。

        说得更清楚一些, 以上面的直方图为例,你可以看到像素主要集中在中间的一些强度值上。直方图均衡化要做的就是拉伸这个范围。见下面左图:绿圈圈出了少有像素分布其上的强度值。对其应用均衡化后,得到了中间图所示的直方图。均衡化的图像见下面右图。把图像变换成像素值是几乎均匀分布的图像。

        对比度:一幅图中灰度反差的大小。对比度 =  最大亮度/最小亮度。

        

        最后,直方图均衡化是怎么做到的? (三步)


        第一步:把直方图的每个灰度级进行归一化处理。

        先说一下涉及到基本概念。

        灰度:灰度是表明图像明暗的数值,即黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0,故黑白图片也称灰度图像。灰度值指的是单个像素点的亮度。灰度值越大表示越亮。

        灰度化:R=B=G。

        灰度值与像素值的关系:一张灰度图像的像素值就是它的灰度值。一张彩色图像的灰度值需要经过函数映射来得到。

        灰度级:灰度级表明图像中不同灰度的最大数量。灰度级越大,图像的亮度范围越大。

        归一化:https://www.cnblogs.com/curo0119/p/8421811.html

                      https://blog.csdn.net/lanmeng_smile/article/details/49903865

        归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。

        归一化函数normalize(),归一化之后所有的像素值都在[0,1]区间内。

 

        第二步:求每种灰度的累积分布,得到一个映射的灰度映射表。

        累积分布函数是单调增函数,并且值域是0到1。

        https://www.cnblogs.com/tianyalu/p/5687782.html

        用以下公式计算累积分布:

        

        其中,n是图像中像素的总和,nk是当前灰度级的像素个数,L是图像中可能的灰度级总数。

        假设有如下图像:

        

        得到的图像统计信息如下图所示,并根据统计信息完成灰度值映射:

        

        概率 = 像素个数 / 图像总的像素个数。如:0.25 = 4 / 16,0.1875 / 16。

        累积概率=概率的前k项之和。k是灰度级。如:第一行是0.25,第二行是0.25+0.1875=0.4375。第三行是0.25+0.1875+0.4375=0.75。

        映射后的灰度值=累积概率*255。如:0.25*255=63.75。0.4375*255=111.5625。

        映射后的图像如下所示:

        

        第三步:根据相应的灰度值来修正原图中的每个像素。

        代码附上,直接调用opencv中的equalizeHist( )函数,就能实现直方图的均衡化。

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;

/**  @function main */
int main(int argc, char** argv)
{
	Mat src, dst;

	/// 加载源图像
	src = imread("D://b.png", 1);

	if (!src.data)
	{
		cout << "Usage: ./Histogram_Demo <path_to_image>" << endl;
		return -1;
	}

	/// 转为灰度图
	cvtColor(src, src, CV_BGR2GRAY);

	/// 应用直方图均衡化
	equalizeHist(src, dst);

	/// 创建窗口
	namedWindow("Source", CV_WINDOW_AUTOSIZE);
	namedWindow("equalized", CV_WINDOW_AUTOSIZE);
        //显示结果
	imshow("Source", src);
	imshow("equalized", dst);

	/// 等待用户按键退出程序
	waitKey(0);

	return 0;
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值