您的位置:首页 > 编程语言 > Python开发

OpenCV Using Python——RGB颜色空间和YCbCr颜色空间的混合肤色检测

2015-02-08 09:34 766 查看

RGB颜色空间和YCbCr颜色空间的混合肤色检测

1. 颜色空间混合肤色检测简介

Kukharev等人为了提高模型的稳定性,将多个颜色空间结合,提出RGB颜色空间和YCbCr颜色空间的混合肤色检测器。像素值满足如下条件:



2. 实现代码

操纵图像的方法是在前面文章的基础上修改得到的,只是将RGB颜色空间3通道的值和YCbCr颜色空间3通道的值结合起来,然后根据上面原作者给出的判断条件作肤色分割。
import cv2
import numpy as np
from matplotlib import pyplot as plt
################################################################################

print 'Load Image'

imgFile = 'images/small_alice.jpg'

# load an original image
img = cv2.imread(imgFile)
################################################################################

print 'YCbCr-RGB Skin Model'

rows,cols,channels = img.shape
################################################################################

# convert color space from rgb to ycbcr
imgYcc = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)

# convert color space from bgr to rgb
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# prepare an empty image space
imgSkin = np.zeros(img.shape, np.uint8)
# copy original image
imgSkin = img.copy()
################################################################################

for r in range(rows):
for c in range(cols):

# non-skin area if skin equals 0, skin area otherwise
skin = 0
########################################################################

# get values from rgb color space
R = img.item(r,c,0)
G = img.item(r,c,1)
B = img.item(r,c,2)

# get values from ycbcr color space
Y = imgYcc.item(r,c,0)
Cr = imgYcc.item(r,c,1)
Cb = imgYcc.item(r,c,2)
########################################################################

# skin color detection

if R > G and R > B:
if (G >= B and 5 * R - 12 * G + 7 * B >= 0) or (G < B and 5 * R + 7 * G - 12 * B >= 0):
if Cr > 135 and Cr < 180 and Cb > 85 and Cb < 135 and Y > 80:
skin = 1
# print 'Skin detected!'

if 0 == skin:
imgSkin.itemset((r,c,0),0)
imgSkin.itemset((r,c,1),0)
imgSkin.itemset((r,c,2),0)

# display original image and skin image
plt.subplot(1,2,1), plt.imshow(img), plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(1,2,2), plt.imshow(imgSkin), plt.title('Transformed YCbCr Skin Image'), plt.xticks([]), plt.yticks([])
plt.show()
################################################################################

print 'Goodbye!'

3. 实现结果

实现结果和前两篇文章很相似,但提取的结果比单一的RGB颜色空间分割有一点点破碎;和改进的YCbCr颜色空间的结果相比,很好地剔除了后一幅图片的头发部分。



结语

最后,我还是没有给出具体哪一种肤色分割的方法最给力。模型的参数大多取决于原作者们的训练数据。换句话说,满足数据的多样性和数量级后总可以找到满足需求的颜色空间。总之,这种取决于训练数据的参数适用的范围很有限,而且也没有用到像素之间的相关性。实验的结果虽然没有结合到现实中的情况,但相比网络上普遍实现的调用单一颜色空间的方式或多或少会给大家一些启示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: