OpenCV-Python开发指南(9)---HSV标记肤色与实现艺术效果

标记肤色

前面,我们通过标记H通道上的红色,从而提取图片上的红色有效区域。那么同样的,我们可以限定肤色的范围,提取人脸的,以达到抠图的效果。

首先,肤色不仅要关注H通道,同样也需要关注S通道。所以,我们首先需要介绍一个函数:split(),定义如下:

img = cv2.imread("4.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)

如上面代码所示,我们可以通过cv2.splite()函数,来获取HSV图像上,所有通道的值。

首先,我们假定人的肤色的大致范围,其色调在[5,170]之间,饱和度在[25,166]之间。这样,我们可以按上一节的内容来获取限定范围内的图像,代码如下所示:

import cv2

img = cv2.imread("4.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
hmask=cv2.inRange(h,5,170)
smask=cv2.inRange(s,25,166)
mask=hmask & smask
result=cv2.bitwise_and(img,img,mask=mask)
cv2.imshow("img",img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后,只要与皮肤颜色相近的图像,都会被提取出来,而其他部分都会变成黑色。
1

实现艺术效果

前面,我们介绍了各种HS通道的应用,一直没有单独的或者强调V的重要性。这里,我们来通过V通道的值,实现一些有趣的艺术效果。

import cv2

img = cv2.imread("9.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
v[:,:]=255
newHSV=cv2.merge([h,s,v])
result=cv2.cvtColor(newHSV,cv2.COLOR_HSV2BGR)
cv2.imshow("img",img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

运行之后,有点非主流的感觉。
非主流

猜你喜欢

转载自blog.csdn.net/liyuanjinglyj/article/details/113796117