图像的偏色检测及颜色校正方法

计算图像色度的平均值和色度的中心距离的比值,可以有效地对图像进行偏色检测。

检测图像是否色偏:

#define _CRT_SECURE_NO_WARNINGS

#include
#include
#include
#include
#include

using namespace cv;
using namespace std;

//检测色偏 输出K值
int main()
{
        int i,j;
	Mat srcimg = imread("test14.jpg");
	Mat LABimg;
	cvtColor(srcimg, LABimg, CV_BGR2Lab);

	float a = 0; //用于记录a轴的平均值
        float b = 0;  //用于记录b轴的平均值
	int HistA[256];     //用于记录a轴每个色度的出现次数
        int HistB[256];      //用于记录b轴每个色度的出现次数
	
        for (i = 0; i < 256; i++)
	{
		HistA[i] = 0;
		HistB[i] = 0;
	}
	for (i = 0; i < LABimg.rows; i++)
	{
		for (j = 0; j < LABimg.cols; j++)
		{
			// 注意将Lab空间取值范围还原成(-127,127]
			a += (float(LABimg.at(i, j)[1]) - 128);
			b += (float(LABimg.at(i, j)[2]) - 128);
			// x表示在a轴的色度值
			int x = LABimg.at(i, j)[1];
			int y = LABimg.at(i, j)[2];
			HistA[x]++;
			HistB[x]++;
		}
	}
	// 计算圆心坐标/均值
	// da大于0,表示偏红;da小于0表示偏绿;db大于0,表示偏黄;db小于0表示偏蓝
	float da = a / float(LABimg.rows*LABimg.cols);
	float db = b / float(LABimg.rows*LABimg.cols);
	
	float ma = 0, mb = 0, r = 0;    // 计算半径
	
	for (i = 0; i < 256; i++)
	{
		ma += abs(i - 128 - da)*HistA[i];
		mb += abs(i - 128 - db)*HistB[i];
	}

	ma /= float(LABimg.cols*LABimg.rows);
	mb /= float(LABimg.cols*LABimg.rows);
	r = sqrt(ma * ma + mb * mb);

	float K;
        K = float(sqrt(da*da + db * db)) / float(r);
	cout << K << endl;    //图像色偏程度和K值呈正相关
	
	return 0;
}

未完待续..

你可能感兴趣的:(图像处理)