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

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颜色空间的结果相比,很好地剔除了后一幅图片的头发部分。

结语

        最后,我还是没有给出具体哪一种肤色分割的方法最给力。模型的参数大多取决于原作者们的训练数据。换句话说,满足数据的多样性和数量级后总可以找到满足需求的颜色空间。总之,这种取决于训练数据的参数适用的范围很有限,而且也没有用到像素之间的相关性。实验的结果虽然没有结合到现实中的情况,但相比网络上普遍实现的调用单一颜色空间的方式或多或少会给大家一些启示。

        



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值