zhai260525088 2016-05-24 06:54 采纳率: 0%
浏览 741

哪位大神能帮我解读一下代码 万分感谢

有关色偏检测的

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;

}

  • 写回答

1条回答 默认 最新

  • Valtava 2016-05-24 08:28
    关注

    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 )

    评论

报告相同问题?

悬赏问题

  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)