有关色偏检测的
double operation::colorCastDetection(IplImage pFrame)
{
IplImage labFrame = cvCreateImage(cvGetSize(pFrame),pFrame->depth,pFrame->nChannels);
cvCvtColor(pFrame,labFrame,CV_BGR2Lab);
double da = 0;//色度a的平均值
double db = 0;//色度b的平均值
double D = 0;//图像平均色度
double Ma = 0;//色度a的方差
double Mb = 0;//色度b的方差
double M = 0;//色度的中心矩
double K = 0;//图像偏色因子
int height = labFrame->height;//图像高度
int width = labFrame->width;//图像宽度
uchar* labData = (uchar*)labFrame->imageData;
for(int i = 0;i < labFrame->height;i++)
{
for(int j = 0;j < labFrame->width;j++)
{
da += labData[i * labFrame->widthStep + j * labFrame->nChannels + 1];
db += labData[i * labFrame->widthStep + j * labFrame->nChannels + 2];
}
}
da = da/height/width;
db = db/height/width;
D = sqrt(pow(da,2) + pow(db,2));
uchar* labData2 = (uchar*)labFrame->imageData;
for(int i = 0;i < labFrame->height;i++)
{
for(int j = 0;j < labFrame->width;j++)
{
Ma += pow(labData2[i * labFrame->widthStep + j * labFrame->nChannels + 1]-da,2);
Mb += pow(labData2[i * labFrame->widthStep + j * labFrame->nChannels + 2]-db,2);
}
}
Ma = Ma/height/width;
Mb = Mb/height/width;
M = sqrt(pow(Ma,2) + pow(Mb,2));
K = D/M;
return K;
}
http://www.cnblogs.com/Imageshop/p/3191853.html
看前面的理论部分就够了。
你代码这里前两行RGB到LAB的色彩空间转换。然后接下来的计算步骤和上面链接中的前面描述一样。
第一个for循环有疑问的话,因为是三通道图,按照lab顺序对图像进行存储,因此
da += labData[i * labFrame->widthStep + j * labFrame->nChannels + 1];
中的+1代表提取a通道,+2代表提取b通道的值。(L通道没有用到,用到的话是 +0 )