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是的,这对我来说似乎是合理的。谢谢你的时间,我真的很难弄清楚这个方程是如何工作的。。。