LipMap检测中的YCbCr

时间:2011-10-24 09:30:29

标签: java

我对将RGB值转换为YCbCr配色方案感到困惑。我使用了这个等式:

int R, G, b;

double Y = 0.229 * R + 0.587 * G + 0.144 * B;
double Cb = -0.168 * R - 0.3313 * G + 0.5 * B + 128;
double Cr = 0.5 * R - 0.4187 * G - 0.0813 * B + 128;

YCbCr的预期输出在0-255之间归一化,我很困惑,因为我的一个来源说它在0-1范围内归一化。 而且它进展顺利,但是当我让LipMap分离/检测到脸上的嘴唇时,我遇到了问题,我实现了这个:

double LipMap = Cr*Cr*(Cr*Cr-n*(Cr/Cb))*(Cr*Cr-n*(Cr/Cb));

n返回0-255,n的等式为:n = 0.95 *(求和(Cr * Cr)/求和(Cr / Cb)) 但另一个消息来源说:n = 0.95 *(((1 / k)*总和(Cr * Cr))/((1 / k)*总和(Cr / Cb))) 其中k等于面部图像中的像素数。

据我所知,它会返回0-255的结果,但在我的程序中,它总是会返回大数字,甚至不会给我0-255

那么有人可以帮我实现这个并解决我的问题吗?

1 个答案:

答案 0 :(得分:0)

根据您在评论中链接的来源,看起来第一个来源中的等式或描述都是错误的:

如果你使用范围[0,255]中的RGB值和给定的转换(你的Cb转换与btw不同。)你应该得到CrCb值范围。

现在,如果你计算 n = 0.95 *(ΣC r 2 /Σ(C r / C b ))您会注意到C r 2 的值范围为[0,65025]而C r / C b 在[0,255]范围内(假设C b = 0是不可能的,因此最高值为255/1 = 255)。 / p>

如果你进一步假设一个具有相当高的红色和低蓝色成分的图像,你将获得 n 的值高于该论文中所述的值:

  

常数η适合范围0..255

的最终值

第二篇论文陈述了这一点,这更有意义恕我直言(虽然我不知道他们是否将C r 和C b 归一化到范围[0,1] ]在计算之前或者如果它们将结果归一化可能导致C r 2 和C r / C 之间的差异更大b'/子>):

  

其中(Cr)2,(Cr / Cb)都归一化为   范围[0 1]。

注意,为了将C r 和C b 归一化到[0,1]范围,你需要将方程的结果除以255或者只需在范围[0,1]中使用RGB并添加0.5而不是128:

//assumes RGB are in range [0,1]
double Cb = -0.168 * R - 0.3313 * G + 0.5 * B + 0.5;
double Cr = 0.5 * R - 0.4187 * G - 0.0813 * B + 0.5;