视频质量检测(3)--图像偏色检测

本文主要介绍图像偏色的检测。
1、偏色的定义
2、算法思路
RGB颜色空间是最简单的一种颜色空间,但是RGB颜色空间最大的局限性在于当用欧氏距离来刻画两种颜色之间的差异时,所计算出的两种颜色之间的距无法正确表征人们实际所感知到的这两种颜色之间的真实差异。
采用CIE Lab颜色空间,此空间所计算出来的颜色之间的距离与实际感知上的差别基本一致。其直方图可以客观的反映图像色偏程度,在CIE Lab下进行偏色图像的自动检测更为合理。
经过对正常图像和偏色图像的分析发现,如果在ab色度坐标平面上的直方图中,色度分布基本上为单峰值,或者分布较为集中,而色度平均值D又较大时,一般都存在色偏,而且色度平均值越大,色偏越严重。然而,如果在ab色度坐标平面上的直方图中色度分布存在明显的多峰值,而且较为分散时,图像色偏程度将大大减轻,甚至没有色偏。
3、算法原理
视频质量检测(3)--图像偏色检测_第1张图片
视频质量检测(3)--图像偏色检测_第2张图片
式中 ,M、 N分别为图像的宽和高,以像素为单位。在 a - b色度平面上,等效圆的中心坐标为 ( da , db ) ,半径为 M 。等效圆的中心到 a - b色度平面中性轴原点为 ( a = 0, b = 0)的距离 D 。由等效圆在 a - b色度平面上的具体位置,来判断图像整体的偏色。da > 0,偏红,否则偏绿。db > 0,偏黄,否则偏蓝。引入偏色因子 K, K值越大 ,偏色越严重。
4、代码实现

void ColorCast(Mat src, float& cast, float& da, float& db)
{
	Mat LabImg;
	cvtColor(src, LabImg, CV_BGR2Lab);

	float Sum_a = 0, Sum_b = 0;
	for (int i = 0; i < src.rows;i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			Sum_a += LabImg.at(i, j)[1];
			Sum_b += LabImg.at(i, j)[2];
		}
	}

	da = Sum_a / (src.cols*src.rows);
	db = Sum_b / (src.cols*src.rows);

	float Ma = 0, Mb = 0;
	float sum_ma = 0, sum_mb = 0;
	for (int i = 0; i < src.rows; i++)
	{
		for (int j = 0; j < src.cols; j++)
		{
			sum_ma += pow((LabImg.at(i, j)[1]- da), 2);
			sum_mb += pow((LabImg.at(i, j)[2]- db), 2);
		}
	}
	Ma = sum_ma / (src.cols*src.rows);
	Mb = sum_mb / (src.cols*src.rows);

	cast = sqrt(da*da + db*db) / sqrt(Ma*Ma + Mb*Mb);
}

得到的da、db应该减去128,将值归一化到(-127,128)之间,再和0进行比较。

本人希望在分享过程中与各位共同学习、共同提高!

你可能感兴趣的:(视频质量诊断,视频图像质量诊断)