OpenCV Using Python——RGB颜色空间中的统计肤色模型
RGB颜色空间中的统计肤色模型
1. 统计肤色模型简介
(1)使用图片训练集建立肤色类和非肤色类的颜色直方图;
(2)计算先验概率:属于肤色类的概率P(Cs)和属于非肤色类的概率P(Cns);
(3)计算条件概率:在肤色类中属于该颜色值的概率P(v|Cs)和在非肤色类中属于该颜色值的概率P(v|Cns);
(4)贝叶斯法则计算后验概率:该颜色块属于肤色类的概率P(Cs|v)。
2. 统计肤色模型实现问题
3. 代码实现
(1)训练代码
import cv2 import numpy as np import os import csv ################################################################################ print 'Set Image Directory' imgFile = 'images/skin_color_database/skin_color_database_1/' ################################################################################ # define variables for histogram colorRange = 64 # skin color counts countSkin = np.zeros(colorRange ** 3, np.double) # non-skin color counts countNonSkin = np.zeros(colorRange ** 3, np.double) # label sets true if it's a label image, otherwise sets false if it's an original image label = True ################################################################################ print 'Skin Color Histogram' for fileName in os.listdir(imgFile): if label == True: # load a label image print 'Label File Name:',fileName imgLabel = cv2.imread(imgFile + fileName) # convert color space from bgr to gray imgLabel = cv2.cvtColor(imgLabel, cv2.COLOR_BGR2GRAY) else: # load an original image print 'Original File Name:',fileName img = cv2.imread(imgFile + fileName) ############################################################################ # count pixel color values if label == False: # get image shape rows,cols,channels = img.shape for r in range(rows): for c in range(cols): # get values from rgb color space B = img.item(r,c,0) / 4 G = img.item(r,c,1) / 4 R = img.item(r,c,2) / 4 color = B * 64 * 64 + G * 64 + R if imgLabel.item(r,c) == 255: countSkin[color] += 1 else: countNonSkin[color] += 1 label = not label ################################################################################ # data combination # ---------countSkin------------ # ---------countNonSkin--------- data = [countSkin, countNonSkin] ################################################################################ # write csv file csvFile = open('skin_nonskin.csv','wb') writer = csv.writer(csvFile) for row in data: writer.writerow([row[col] for col in range(colorRange ** 3)]) ################################################################################ print 'Goodbye!'
(2)测试代码
import os import cv2 import csv import numpy as np from matplotlib import pyplot as plt from mpl_toolkits.mplot3d.axes3d import Axes3D ################################################################################ print 'read csv file' VRange = 64 * 64 * 64 print VRange countSkin = np.zeros(VRange, np.double) countNonSkin = np.zeros(VRange, np.double) csvFile = open('skin_nonskin.csv', "rb") reader = csv.reader(csvFile) rowNum = 0 for row in reader: colNum = 0 for col in row: # restore countSkin and countNonSkin modNum = rowNum - rowNum / 2 * 2 if modNum == 1: countNonSkin[((rowNum - 1) * VRange + colNum)] = float(col) if modNum == 0: countSkin[((rowNum - 1) * VRange + colNum)] = float(col) colNum += 1 rowNum += 1 ################################################################################ print 'Skin Color Database Result' # count print 'count of skin pixels:',countSkin print 'count of non-skin pixels:',countNonSkin ################################################################################ print 'prior probability' skinPix = sum(countSkin) nskinPix = sum(countNonSkin) PCs = skinPix / (skinPix + nskinPix) # P(Cs) PCns = 1 - PCs # P(Cns) print 'probability of skin class:',PCs print 'probability of non-skin class',PCns ################################################################################ print 'conditional probability variables' PVCs = np.zeros(VRange, np.double) # P(V|Cs) PVCns = np.zeros(VRange, np.double) # P(V|Cns) for i in range(VRange): # pixel color probability given skin color PVCs[i] = countSkin[i] / skinPix # pixel color probability given non-skin color PVCns[i] = countNonSkin[i] / nskinPix ################################################################################ print 'posterior probability' PCsV = np.zeros(VRange, np.double) # P(Cs|V) for i in range(VRange): # skin probability given pixel color PCsV[i] = (PVCs[i] * PCs) / (PVCs[i] * PCs + PVCns[i] * PCns + 0.00000001) ################################################################################ print 'determine skin distribution' # pixel color range v = range(VRange) # skin class threshold theta = [0.6,0.7,0.8,0.9] # color of a single class rgbColor = np.zeros(3, np.uint8) # rgb color value skinPix = np.zeros(VRange, np.uint8) # prepare for 3d plot fig = plt.figure() ax = fig.add_subplot(111, projection = '3d') for i in v: # split 3 channels(64b * 64b * 64b) B = i / (64 * 64) G = (i - B * 64 * 64) / 64 R = i - B * 64 * 64 - G * 64 # given probability as threshold if PCsV[i] > theta[3]: skinPix[i] = 4 ax.scatter(R, G, B, c='r', marker='o') else: skinPix[i] = 0 ################################################################################ print 'display distribution of skin color' ax.set_xlabel('Red') ax.set_ylabel('Green') ax.set_zlabel('Blue') plt.show() ################################################################################ print 'Goodbye!'<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
结语
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。