cielab颜色空间标准色,颜色值转rgb
RGB转为色空间首先RGB是不可以直接转为色空间颜色空间的,RGB需要先转为CIEXYZ颜色空间,然后再由CIEXYZ颜色空间转为色空间颜色空间。关于这2个颜色空间的互转,主要参考了这篇文章。
RGB转实验室颜色空间的代码如下:
void RGB2LAB(Mat rgb,Mat Lab) {
//RGB转坐标
Mat XYZ(rgb.size(),rgb。type());
Mat_ Vec3b:迭代器beginRGB=rgb.begin Vec3b
Mat_ Vec3b:迭代器endRGB=rgb.end Vec3b
Mat_ Vec3b:迭代器beginXYZ=XYZ.begin Vec3b
int shift=22
for(;beginRGB!=endRGBbeginRGB,beginXYZ)
{
(* begin XYZ)[0]=((* begin RGB)[0]* 199049(* begin RGB)[1]* 394494(* begin RGB)[2]* 455033 524288)(shift-2);
(* begin XYZ)[1]=((* begin RGB)[0]* 75675(* begin RGB)[1]* 749900(* begin RGB)[2]* 223002 524288)(shift-2);
(* begin XYZ)[2]=((* begin RGB)[0]* 915161(* begin RGB)[1]* 114795(* begin RGB)[2]* 18621 524288)(shift-2);
}
//XYZ转实验室
int LabTab[1024];
for(int I=0;i 1024我)
{
如果(i 9)
LabTab[I]=(int)(pow((float)I/1020,1.0f/3)*(1 shift)0.5);
其他
LabTab[I]=(int)((29 * 29.0 * I/(6 * 6 * 3 * 1020)4.0/29)*(1移位)0.5);
}
const int scale LC=(int)(16 * 2.55 *(1移位)0.5);
const int scale lt=(int)(116 * 2.55 0.5);
const int HalfShiftValue=524288
beginXYZ=XYZ.begin Vec3b
Mat_ Vec3b:迭代器endXYZ=XYZ.end Vec3b
Lab.create(rgb.size()、rgb。type());
Mat_ Vec3b:迭代器beginLab=Lab.begin Vec3b
for(;beginXYZ!=endXYZbeginXYZ,beginLab)
{
int X=LabTab[(* begin XYZ)[0]];
int Y=LabTab[(* begin XYZ)[1]];
int Z=LabTab[(* begin XYZ)[2]];
int L=((scale lt * Y-scale LC半移值)shift);
int A=((500 *(X-Y)半移位值)shift)128;
int B=((200 *(Y-Z)半移位值)shift)128;
(* begin lab)[0]=L;
(* begin lab)[1]=A;
(* begin lab)[2]=B;
}
}利用实验室颜色空间进行偏色检测这种方法是《基于图像分析的偏色检测及颜色校正方法》 ——徐晓昭,蔡轶珩提出来的一个理论,大概是说:图像的偏色不仅与图像色度的平均值有直接关系,还与图像的色度分布特性有关。如果在甲-乙色度坐标平面上的二维直方图中色度分布基本上为单峰值,或者分布较为集中,而色度平均值又较大时,一般都存在偏色,而且色度平均值越大,偏色越严重。因此引入等效圆的概念,采用图像平均色度D和色度中心距M的比值,即偏色因子K来衡量图像的偏色程度。其计算方法如下式:
其中甲,乙代表的就是实验室色度空间的甲,乙。男,女代表图片长宽,一般来说当求出的K值不大于1.5我们可以认为其整体图像偏色的可能性不大。
//真代表存在偏色,假的代表不存在偏色
布尔偏色判断(Mat im glab){
Mat_ Vec3b:迭代器begin=imgLab.begin Vec3b
Mat_ Vec3b:迭代器end=imgLab.end Vec3b
浮点suma=0,sumb=0;
for(;开始!=结束;开始){
suma=(* begin)[1];//a
sumb=(* begin)[2];//b
}
int MN=img lab。行数* img实验室。cols
双da=suma/MN-128;//归一化到[-128,127]
double Db=sumb/MN-128;//同上
//求平均色度
double D=sqrt(Da * Da Db * Db);
begin=imgLab.begin Vec3b
双Ma=0,Mb=0;
//求色度中心距
for(;开始!=结束;开始){
ma=ABS((* begin)[1]-128-Da);
MB=ABS((* begin)[2]-128-Db);
}
Ma=Ma/MN;
Mb=Mb/MN;
double M=sqrt(Ma * Ma Mb * Mb);
浮子K=浮子(日/月);
如果(K=1.5) {
返回真实的
}
否则{
返回错误的
}
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。