qq_34683777 2018-12-20 10:50 采纳率: 0%
浏览 484

图像色偏检测,Ma+=abs(i-128-da)*HistA[i];//计算范围-128~127 Mb+=abs(i-128-db)*HistB[i];

请问下面检测色偏的代码中
Ma+=abs(i-128-da)*HistA[i];//计算范围-128~127
Mb+=abs(i-128-db)*HistB[i];
这两句什么意思,为什么要用a* 和b*的范围值减去分量值

/********************************************************************************************
*函数描述: calcCast 计算并返回一幅图像的色偏度以及,色偏方向
*函数参数: InputImg 需要计算的图片,BGR存放格式,彩色(3通道),灰度图无效
* cast 计算出的偏差值,小于1表示比较正常,大于1表示存在色偏
* da 红/绿色偏估计值,da大于0,表示偏红;da小于0表示偏绿
* db 黄/蓝色偏估计值,db大于0,表示偏黄;db小于0表示偏蓝
*函数返回值: 返回值通过cast、da、db三个应用返回,无显式返回值
*********************************************************************************************/
void colorException(Mat InputImg,float& cast,float& da,float& db)
{
Mat LABimg;
cvtColor(InputImg,LABimg,CV_BGR2Lab);//参考http://blog.csdn.net/laviewpbt/article/details/9335767
//由于OpenCV定义的格式是uint8,这里输出的LABimg从标准的0~100,-127~127,-127~127,被映射到了0~255,0~255,0~255空间
float a=0,b=0;
int HistA[256],HistB[256];
for(int i=0;i<256;i++)
{
HistA[i]=0;
HistB[i]=0;
}
for(int i=0;i<LABimg.rows;i++)
{
for(int j=0;j<LABimg.cols;j++)
{
a+=float(LABimg.at<cv::Vec3b>(i,j)[1]-128);//在计算过程中,要考虑将CIE L*a*b*空间还原 后同
b+=float(LABimg.at<cv::Vec3b>(i,j)[2]-128);
int x=LABimg.at<cv::Vec3b>(i,j)[1];
int y=LABimg.at<cv::Vec3b>(i,j)[2];
HistA[x]++;
HistB[y]++;
}
}
da=a/float(LABimg.rows*LABimg.cols);
db=b/float(LABimg.rows*LABimg.cols);
float D =sqrt(da*da+db*db);
float Ma=0,Mb=0;
for(int i=0;i<256;i++)
{
Ma+=abs(i-128-da)*HistA[i];//计算范围-128~127
Mb+=abs(i-128-db)*HistB[i];
}
Ma/=float((LABimg.rows*LABimg.cols));
Mb/=float((LABimg.rows*LABimg.cols));
float M=sqrt(Ma*Ma+Mb*Mb);
float K=D/M;
cast = K;
return;
}
  • 写回答

1条回答 默认 最新

  • threenewbee 2018-12-20 03:17
    关注

    Ma+=abs(i-128-da)*HistA[i];
    之前代码注释告诉你了,把颜色分量+128,把-128~127变成了0~255
    所以abs(i-128-da)是把它减回来
    HistA[i]这个是颜色直方图数组,也就是把之前统计出来的按照下标丢进去计数的
    所以这里要相乘。

    如果还不理解,我打个比方。假设你有一些小盒子,小盒子里面可以装0、1、2、3个珠子。我现在要你算一共有几个珠子,你可以这么做
    首先拿一张纸,写0 1 2 3四个数字,然后依次拿出你的盒子,遇到1个珠子,你就在1下面写正字的一笔,如果2个珠子,就在2下面写一笔。
    最后统计如下
    0个的有10个
    1个的有4个
    2个的有3个
    3个的有8个。
    问你有多少珠子?
    是不是
    10*0+4*1+2*3+3*8
    这里用来统计的那张纸,就是HistA、HistB这个数组的作用
    所以是乘法,再累加。

    评论

报告相同问题?

悬赏问题

  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元