我使用以下算法来检测肤色,但它在不同的光照条件下效果不佳。任何人都可以提供任何建议,如何改进它或建议更好的方法
R > 95 AND G > 40 AND B > 20 AND
max{R, G, B} – min{R, G, B} >15 AND
|R – G| > 15 AND
R > G AND R > B
OR
R > 220 AND G > 210 AND B > 170 AND
|R – G| <= 15 AND
R > B AND G > B
http://softexpert.wordpress.com/2007/10/17/skin-color-detection/
干杯
答案 0 :(得分:6)
您给定的算法是基于颜色的简单阈值处理。这仅适用于一组非常基本的条件。对于一些图片,它可能会给出非常好的结果,但作为一般检测器,它会产生不良结果。
你的第一道攻击应该是切换到不同于照明的不同颜色模型。事实上,您明确提供的链接说明了这一点!例如,HSI。就个人而言,我更喜欢用L * a * b *做一些事情,但是从RGB转换的实现将更加困难。
你应该考虑添加一些额外的先前术语,例如,孤立的像素不能是皮肤。
答案 1 :(得分:4)
皮肤颜色建模有很多方法,每种方法都有其优点和缺点。
根据您的目的选择一个。看看这些调查:
诉Vezhnevets,V。Sazonov,A。Andreeva。 A survey on pixel-based skin color detection techniques. Proc。 Graphicon,2003
P上。 Kakumanu,S。Makrogiannis,N。Bourbakis。 A survey of skin-color modeling and detection methods.模式识别,2007
答案 2 :(得分:3)
我已经使用色度成分来快速获得图像的肤色区域。
这并不完美,但如果您想要的只是快速而肮脏的方法,那就没关系。
这篇论文被Douglas Chai称为“使用可视电话应用中的肤色地图进行人脸分割”。这是一个相当古老的方法(1999年)。不幸的是,论文本身就是付费墙,但这种方法很简单:
答案 3 :(得分:3)
如果使用RGB,则会出现照明(亮度)问题。处理肤色检测的最佳方法是YCbCr成分。 Y表示亮度Cb,Cr表示色度。每个都表示为RGB颜色的加权表达式。但是你只使用Cb和Cr来识别肤色。 Y被丢弃,因为您不想在分析中使用发光体。所以使用YCbCr而不是RGB。希望我帮忙!
答案 4 :(得分:2)
请参阅我对强健手部检测的答案here,其中我推荐了一种使用颜色直方图的方法,该方法仅使用最初来自Gary Bradski(OpenCV的创建者)关于面部跟踪的论文的图像的色调和饱和度通道。它包括方法的概述以及如何检测皮肤区域的示例代码的链接。
该方法简单但对噪声和光照变化相当稳健,并且能够检测不同的肤色。无需机器学习:)。