Java YCbCr在LipMap检测中的应用

Java YCbCr在LipMap检测中的应用,java,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范围内标准化。 它

我对将
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


那么有谁能帮我实现这一点并解决我的问题吗?

从您在评论中链接的来源来看,第一个来源中的方程式或描述似乎是错误的:

如果使用[0255]范围内的RGB值和给定的转换(您的
Cb
转换与该btw不同),则应获得相同范围内的
Cr
Cb

现在,如果你计算n=0.95*(∑Cr2/∑(Cr/Cb)),你会注意到Cr2的值在[065025]范围内,而Cr/Cb在[0255]范围内(假设Cb=0是不可能的,因此最高值是255/1=255)

如果你进一步假设一幅图像有相当高的红色和低的蓝色分量,你会得到比那篇文章中所述的更高的n值:

常数η符合范围0..255内的最终值

第二篇论文指出了这一点,这在IMHO中更有意义(尽管我不知道他们是否在计算之前将Cr和Cb标准化到范围[0,1],或者他们是否将结果标准化,这可能导致Cr2和Cr/Cb之间的更大差异):

式中,(Cr)2,(Cr/Cb)均标准化为 范围[0 1]

请注意,为了将Cr和Cb标准化为[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;

请帮帮我:唇图是什么?你的意思是嘴唇映射,如在面部检测嘴唇?你得到的
Y
Cb
Cr
的值是多少?它们是否在0-255范围内?
n
的价值是什么?我已经更新了这个问题,对不起,我认为我的问题没有那么完整的信息。。。我希望你能和我分享你的知识,先生,你能把这些来源联系起来吗?我怀疑您的
Cr
Cb
计算错误。如果你自己(在纸上)对单个红色像素进行这些计算,你会发现,对于0-255范围内的值,
LipMap
值太高,除非有一些额外的标准化。如果你对0-1范围内的值(即
Cb=0.332
Cr=1.0
R=1,G=0,B=0
)进行计算,我得到
LipMap~0.997
,这对我来说似乎是合理的。这些是我的来源:因此根据你的回答,我应该这样做:根据你的回答,我应该这样做:双红=R/255;双绿=G/255;双蓝=B/255;双色Cb=-0.168*红色-0.3313*绿色+0.5*蓝色+0.5;双色Cr=0.5*红色-0.4187*绿色-0.0813*蓝色+0.5;然后我实现LipMap方程,对吗?@jpeter723是的,这对我来说似乎是合理的。谢谢你的时间,我真的很难弄清楚这个方程是如何工作的。。。