博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
肤色阈值分割
阅读量:5143 次
发布时间:2019-06-13

本文共 12779 字,大约阅读时间需要 42 分钟。

1.视频帧读取图像(YCbCr+Ostu滤波)

# -*- coding: utf-8 -*-"""Created on Mon Dec 10 11:31:43 2018@author: 1"""import cv2cap = cv2.VideoCapture(0)cap.set(3,640)cap.set(4,480)#调整参数实现读取视频或调用摄像头while(cap.isOpened()):    ret_flag , Vshow = cap.read()#Vshow是一个三维矩阵#        gray = cv2.cvtColor(Vshow,cv2.COLOR_BGR2GRAY)#        cv2.imshow("Gray",gray)    cv2.imshow("Capture_Test",Vshow)  #窗口显示,显示名为 Capture_Test    k = cv2.waitKey(1) & 0xFF #每帧数据延时 1ms,延时不能为 0,否则读取的结果会是静态帧    if  k == ord('s'):  #若检测到按键 ‘s’,打印字符串         #显示图片分辨率#            print(cap.get(3));#            print(cap.get(4));#                img= cv2.cvtColor(Vshow,cv2.COLOR_BGR2GRAY)        #        #肤色分割##                img = cv2.imread('YCbCr OR.jpg', cv2.IMREAD_COLOR)#        ycrcb = cv2.cvtColor(Vshow, cv2.COLOR_BGR2YCrCb) # 把图像转换到YUV色域#        (y, cr, cb) = cv2.split(ycrcb) # 图像分割, 分别获取y, cr, br通道图像#        # 高斯滤波, cr 是待滤波的源图像数据, (5,5)是值窗口大小, 0 是指根据窗口大小来计算高斯函数标准差#        cr1 = cv2.GaussianBlur(cr, (5, 5), 0) # 对cr通道分量进行高斯滤波#        # 根据OTSU算法求图像阈值, 对图像进行二值化#        #_, skin1 = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) #        _, img = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)#        #cv2.imshow("image CR", cr1)##                cv2.imshow("Skin Cr+OSTU", skin )                cv2.imwrite("test.jpg",Vshow)        # 肤色检测之一: YCrCb之Cr分量 + OTSU二值化        img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)        ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把图像转换到YUV色域        (y, cr, cb) = cv2.split(ycrcb) # 图像分割s, 分别获取y, cr, br通道图像        # 高斯滤波, cr 是待滤波的源图像数据, (5,5)是值窗口大小, 0 是指根据窗口大小来计算高斯函数标准差        cr1 = cv2.GaussianBlur(cr, (5, 5), 0) # 对cr通道分量进行高斯滤波        # 根据OTSU算法求图像阈值, 对图像进行二值化        #_, skin1 = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)         _, skin1 = cv2.threshold(cr1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)        cv2.imshow("image", img)#        cv2.imshow("image CR", cr1)        cv2.imshow("Skin Cr+OSTU", skin1 )    elif k == 27:#检测到esc则退出  #ord('q'): #若检测到按键 ‘q’,退出        breakcap.release()cv2.destroyAllWindows()

2.HSV颜色空间阈值分割

# -*- coding: utf-8 -*-"""Created on Mon Dec 10 15:30:18 2018@author: 1"""import cv2import numpy as npfrom matplotlib import pyplot as plt################################################################################ print('Pixel Values Access') imgFile = 'test.jpg' # load an original imageimg = cv2.imread(imgFile)img1 = cv2.imread(imgFile)################################################################################ print('HSV Skin Model') rows,cols,channels = img.shape # convert color space from bgr to rgb                        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # prepare an empty image spaceimgSkin = np.zeros(img.shape, np.uint8)# copy original imageimgSkin = img.copy()                        # convert color space from rgb to hsvimgHsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV) for r in range(rows):    for c in range(cols):         # get values of hue, saturation and value        # standard -- h range: [0,360]; s range: [0,1]; v range: [0,255]        # opencv -- h range: [0,180]; s range: [0,255]; v range: [0,255]               H = imgHsv.item(r,c,0)        S = imgHsv.item(r,c,1)        V = imgHsv.item(r,c,2)                # non-skin area if skin equals 0, skin area otherwise                skin = 0                        if ((H >= 0) and (H <= 25 / 2)) or ((H >= 335 / 2) and (H <= 360 / 2)):            if ((S >= 0.2 * 255) and (S <= 0.6 * 255)) and (V >= 0.4 * 255):                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#img= imgSkin[...,::-1]#cv2.imwrite("HSV.jpg",img)#plt.subplot(1,2,1), plt.imshow(img), plt.title('Original Image'), plt.xticks([]), plt.yticks([])#plt.subplot(1,2,2), img2= img1[...,::-1]plt.imshow(img2)plt.title('Original')plt.xticks([])plt.yticks([])#plt.imshow(imgSkin)#plt.title('HSV')plt.show()                                                #################################################################################img = cv2.imread('YCbCr OR.jpg', cv2.IMREAD_COLOR) #hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 把图像转换到HSV色域#(_h, _s, _v) = cv2.split(hsv) # 图像分割, 分别获取h, s, v 通道分量图像#skin3 = np.zeros(_h.shape, dtype=np.uint8)  # 根据源图像的大小创建一个全0的矩阵,用于保存图像数据#(x, y) = _h.shape # 获取源图像数据的长和宽## 遍历图像, 判断HSV通道的数值, 如果在指定范围中, 则置把新图像的点设为255,否则设为0#for i in  range(0, x):#    for j in  range(0, y):#        if (_h[i][j] >  7) and (_h[i][j] <  20) and (_s[i][j] >  28) and (_s[i][j] <  255) and (_v[i][j] >  50) and (_v[i][j] <  255):#            skin3[i][j] =  255#        else:#            skin3[i][j] =  0#cv2.imshow('YCbCr OR.jpg', img)#cv2.imshow('YCbCr OR.jpg' +  " Skin3 HSV", skin3)

3.RGB阈值分割

# -*- coding: utf-8 -*-"""Created on Mon Dec 10 15:32:32 2018@author: 1"""import cv2import numpy as npfrom matplotlib import pyplot as plt################################################################################ #print 'Pixel Values Access' imgFile = 'test.jpg' # load an original imageimg = cv2.imread(imgFile) # access a pixel at (row,column) coordinatespx = img[150,200]#print 'Pixel Value at (150,200):',px # access a pixel from blue channelblue = img[150,200,0]# access a pixel from green channelgreen = img[150,200,1]# access a pixel from red channelred = img[150,200,2]#print 'Pixel Value from B,G,R channels at (150,200): ',blue,green,red################################################################################ #print 'Pixel Values Modification'# img[150,200] = [0,0,0]#print 'Modified Pixel Value at (150,200):',px################################################################################# better way: using numpy # access a pixel from blue channelblue = img.item(100,200,0)# access a pixel from green channelgreen = img.item(100,200,1)# access a pixel from red channelred = img.item(100,200,2)#print 'Pixel Value using Numpy from B,G,R channels at (100,200): ',blue,green,red # warning: we can only change pixels in gray or single-channel image # modify green value: (row,col,channel)img.itemset((100,200,1),255)# read green valuegreen = img.item(100,200,1)#print 'Modified Green Channel Value Using Numpy at (100,200):',green################################################################################ #print 'Skin Model' rows,cols,channels = img.shape # prepare an empty image spaceimgSkin = np.zeros(img.shape, np.uint8)# copy original imageimgSkin = img.copy() for r in range(rows):    for c in range(cols):         # get pixel value               B = img.item(r,c,0)        G = img.item(r,c,1)        R = img.item(r,c,2)                # non-skin area if skin equals 0, skin area otherwise                skin = 0                        if (abs(R - G) > 15) and (R > G) and (R > B):            if (R > 95) and (G > 40) and (B > 20) and (max(R,G,B) - min(R,G,B) > 15):                               skin = 1                    # print 'Condition 1 satisfied!'            elif (R > 220) and (G > 210) and (B > 170):                skin = 1                # print 'Condition 2 satisfied!'                if 0 == skin:            imgSkin.itemset((r,c,0),0)            imgSkin.itemset((r,c,1),0)                            imgSkin.itemset((r,c,2),0)            # print 'Skin detected!' # convert color space of images because of the display difference between cv2 and matplotlib                         img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#cv2.imwrite("RGB.jpg",imgSkin)imgSkin = cv2.cvtColor(imgSkin, cv2.COLOR_BGR2RGB) # 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('RGB'), plt.xticks([]), plt.yticks([])plt.show()                                                ################################################################################ #print 'Waiting for Key Operation' k = cv2.waitKey(0) # wait for ESC key to exitif 27 == k:    cv2.destroyAllWindows()

4.YCbCr颜色空间方法一

# -*- coding: utf-8 -*-"""Created on Wed Dec  5 14:37:04 2018@author: 1"""import cv2import numpy as npfrom matplotlib import pyplot as plt################################################################################ print ('Pixel Values Access') imgFile = 'test.jpg' # load an original imageimg = cv2.imread(imgFile)################################################################################ print ('YCbCr Skin Model') rows,cols,channels = img.shape################################################################################# light compensation gamma = 0.95 for r in range(rows):    for c in range(cols):                # get values of blue, green, red             B = img.item(r,c,0)        G = img.item(r,c,1)        R = img.item(r,c,2)                # gamma correction        B = int(B ** gamma)          G = int(G ** gamma)         R = int(R ** gamma)                # set values of blue, green, red        img.itemset((r,c,0), B)        img.itemset((r,c,1), G)        img.itemset((r,c,2), R)                  ################################################################################ # convert color space from rgb to ycbcrimgYcc = 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 spaceimgSkin = np.zeros(img.shape, np.uint8)# copy original imageimgSkin = img.copy()                       ################################################################################ # define variables for skin rules Wcb = 46.97Wcr = 38.76 WHCb = 14WHCr = 10WLCb = 23WLCr = 20 Ymin = 16Ymax = 235 Kl = 125Kh = 188 WCb = 0WCr = 0 CbCenter = 0CrCenter = 0################################################################################ for r in range(rows):    for c in range(cols):                # non-skin area if skin equals 0, skin area otherwise                skin = 0                ########################################################################                # color space transformation                # get values from ycbcr color space             Y = imgYcc.item(r,c,0)        Cr = imgYcc.item(r,c,1)        Cb = imgYcc.item(r,c,2)                                                                                                                                                if Y < Kl:            WCr = WLCr + (Y - Ymin) * (Wcr - WLCr) / (Kl - Ymin)            WCb = WLCb + (Y - Ymin) * (Wcb - WLCb) / (Kl - Ymin)                        CrCenter = 154 - (Kl - Y) * (154 - 144) / (Kl - Ymin)            CbCenter = 108 + (Kl - Y) * (118 - 108) / (Kl - Ymin)                                elif Y > Kh:            WCr = WHCr + (Y - Ymax) * (Wcr - WHCr) / (Ymax - Kh)            WCb = WHCb + (Y - Ymax) * (Wcb - WHCb) / (Ymax - Kh)             CrCenter = 154 + (Y - Kh) * (154 - 132) / (Ymax - Kh)            CbCenter = 108 + (Y - Kh) * (118 - 108) / (Ymax - Kh)                 if Y < Kl or Y > Kh:            Cr = (Cr - CrCenter) * Wcr / WCr + 154                        Cb = (Cb - CbCenter) * Wcb / WCb + 108        ########################################################################                # skin color detection                if Cb > 77 and Cb < 127 and Cr > 133 and Cr < 173:            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.imshow(img)YCbCr_= imgSkin[...,::-1]#将Plt RGB转换到cv BGR#cv2.imwrite("YCbCr_4.jpg",YCbCr_)plt.imshow(imgSkin)plt.title('YCbCr')plt.axis('off')#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()

5.YCbCr颜色空间方法二

# -*- coding: utf-8 -*-"""Created on Mon Dec 10 15:37:03 2018@author: 1"""import cv2import numpy as npimg = cv2.imread('YCbCr OR.jpg', cv2.IMREAD_COLOR)ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把图像转换到YUV色域(y, cr, cb) = cv2.split(ycrcb) # 图像分割, 分别获取y, cr, br通道分量图像skin2 = np.zeros(cr.shape, dtype=np.uint8) # 根据源图像的大小创建一个全0的矩阵,用于保存图像数据(x, y) = cr.shape # 获取源图像数据的长和宽# 遍历图像, 判断Cr和Br通道的数值, 如果在指定范围中, 则置把新图像的点设为255,否则设为0for i in  range(0, x):     for j in  range(0, y):        if (cr[i][j] >  140) and (cr[i][j] <  175) and (cb[i][j] >  100) and (cb[i][j] <  120):            skin2[i][j] =  255        else:            skin2[i][j] =  0cv2.imshow('YCbCr OR.jpg', img)cv2.imshow('YCbCr OR.jpg' +  " Skin2 Cr+Cb", skin2)

 

转载于:https://www.cnblogs.com/Manuel/p/10430172.html

你可能感兴趣的文章
Eclipse插件安装4种方法
查看>>
JavaWeb学习总结(十二)——Session
查看>>
王爽汇编 实验13
查看>>
HDU - 1232 畅通工程【并查集】
查看>>
maven 控制台 打包
查看>>
Android 之布局(一)
查看>>
hadoop mapreduce经常OOM
查看>>
【转载】使用注解和反射实现通用性…
查看>>
使用Stickers拓展集成iMessage简单功能
查看>>
Leetcode 54: Spiral Matrix
查看>>
Jmeter深度学习第一天——简单请求、带header请求、返回值乱码问题
查看>>
error C2662 无法将左值绑定到右值 —— 变量永远是左值,即使它的类型为右值引用...
查看>>
C#, CLR, and .NET Framework versions
查看>>
python初识面向对象(一)
查看>>
k8s(6)-滚动更新
查看>>
特殊权限SUID
查看>>
C#获取IP地址
查看>>
Linux:PS命令详解与使用
查看>>
PHP设计模式:值对象模式
查看>>
解决python中csv文件中文写入问题
查看>>