代码语言:javascript复制
import cv2
img=cv2.imread("C:/Users/xpp/Desktop/image.png")
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#将图片从BGR色彩空间转换到HSV色彩空间
h,s,v=cv2.split(hsv)#顺序是h,s,v
minHue=5
maxHue=170
hueMask=cv2.inRange(h,minHue,maxHue)#色调值在[5,170]之间
minSat=25
maxSat=166
satMask=cv2.inRange(s,minSat,maxSat)#饱和度在[25,166]之间
mask=hueMask&satMask
roi=cv2.bitwise_and(img,img,mask=mask)#正常显示感兴趣区域,而将其余区域显示为黑色
cv2.imshow("img",img)
cv2.imshow("ROI",roi)
cv2.waitKey()
cv2.destroyAllWindows()
算法:肤色范围划定为:色调值在[5,170]之间,饱和度值在[25,166]之间(肤色范围根据实际图片设定)。
- 首先通过inRange函数锁定特定值
dst=cv2.inRange(src, lowerb, upperb)
dst表示输出结果,大小和src一致。
src表示要检查的数组或图像。
lowerb表示范围下界。
upperb表示范围上界。
- 通过基于掩码的按位与显示ROI
- 显示特定颜色值
上图是原始图像,图像背景是白色的,下图是提取结果,提取后的图像保留了人像肤色(包含衣服)部分,背景为黑色。
注意:在HSV色彩空间中,H通道(饱和度Hue通道)对应不同的颜色。或者换个角度理解,颜色的差异主要体现在H通道值的不同上。所以,通过对H通道值进行筛选,便能够筛选出特定的颜色。