本文主要介绍图像亮度异常的检测。
1、亮度异常的定义
视频画面中过亮或者过暗的区域超过一定比例。
2、算法思路
计算图片在灰度图上的均值和方差,如果存在亮度异常时,均值会偏离基准点(可以假设为128或者其他值),方差也会偏大;通过计算灰度图的均值和方差,就可评估图像是否存在过曝光或曝光不足。
但实际上,图像的均值就可以表征画面的亮暗度;考虑方差的因素,需要参考选择的基准点(不同基准点,方差误差较大),综合判断图像亮度的异常。
3、代码实现
void JudgeBright1(Mat src, float &da)
{
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
Mat means, stddev;
meanStdDev(gray, means, stddev);
da = means.at<double>(0);
}
void JudgeBright2(Mat src, float &da, float &k)
{
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
float Sum_a = 0;
int Hist[256] = { 0 };
double meanV = 0;
for (int i = 0; i < gray.rows; i++)
{
uchar *ptr = gray.ptr<uchar>(i);
for (int j = 0; j < gray.cols; j++)
{
Sum_a = Sum_a + (ptr[j] - 100);
Hist[ptr[j]]++;
}
}
da = Sum_a / (gray.rows*gray.cols);
float D = abs(da);
float ma = 0,sum_m =0;
for (int i = 0; i < 256; i++)
{
sum_m = sum_m + abs((i - 100) - da)*Hist[i];
}
ma = sum_m / (gray.rows*gray.cols);
float M = abs(ma);
k = D / M;
}
方法一简单实现,只需根据实际需要中对正常、过亮、过暗的图像均值做好统计,选择合适的阈值即可;
方法二,原理上更为合理,但实际中基准点的选择会导致结果有很大误差。
本人希望在分享过程中与各位共同学习、共同提高!