opencv c++ 直方图均衡化(26)

原理:

通过改变图像的直方图来改变图像中各像素的灰度值,即将直方图变换为均匀分布的模式,将像素个数多的灰度值进行展宽,像素个数少的灰度值进行归并,从而增大对比度,进而使得图像清晰。

作用:

用于增强动态范围偏小的图像的对比度,从而提升对目标对象检测的准确率。

用途:

人脸检测,医学影像图像,卫星遥感图像。

API:

equalizeHist(src, dst)

src // 输入的灰度图像

dst //输出

官方解释:

opencv c++ 直方图均衡化(26)_第1张图片

 

均衡化解释:

将变化前后的像素值分别记为r、s,对于r、s来说,必有:

s = T\left ( r \right ) 

记r、s的概率密度为p\left ( r \right )p\left ( s \right ),则有:

p\left ( r \right )dr = p\left ( s \right )ds

又由于s是服从均匀分布的,则对于其分布函数有:

F\left ( s \right ) = \int_{-00}^{s}p\left ( s \right )ds = \int_{-00}^{r}p\left ( r \right )dr

F\left ( s \right )求导,有:

p(s) = \frac{d\left [ \int_{-00}^{r}p\left ( r \right )dr \right ]}{ds} = p\left ( r \right )\frac{dr}{ds} = p\left ( r \right )\frac{dr}{d\left [ T\left ( r \right ) \right ]}

 再结合归一化区间为[0, 1], 因此p(s) = 1,ds = p(r)dr,对其积分后有:

s = \int_{0}^{r}p\left ( r \right )dr = T\left ( r \right )

对其离散化即可得到如下公式

s_{k} =\sum_{j= 0}^{k}p\left ( r_{j} \right ) = \sum_{j= 0}^{k}\frac{n_{j}}{n}

n_{j}为对应像素值等于r_{j}的像素点的数量,n为总像素点数。

opencv c++ 直方图均衡化(26)_第2张图片

上图解释:

当k = 1时,对第二个级别的像素进行均衡化,对应相同像素值为1/7的像素点有1023个,将其加上790,除以总数4096得到对应的概率密度值s_{1}为0.44,该值近似等于原像素值等级中的3/7,因此将像素值为1/7的像素点的像素值全部修改为3/7.

 代码:

void QuickDemo::histogram_eq_demo(Mat& image)
{
	Mat gray;
	cvtColor(image, gray, COLOR_BGR2GRAY);
	Mat dst;
	equalizeHist(gray, dst);
	imshow("灰度图", gray);
	imshow("直方图均衡化", dst);
}

 结果:

 

你可能感兴趣的:(opencv,c++,opencv,人工智能,计算机视觉)