问题描述
- 哪位大神能帮我解读一下代码 万分感谢
-
有关色偏检测的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 )
时间: 2024-08-30 15:13:12