标记肤色
前面,我们通过标记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()
运行之后,只要与皮肤颜色相近的图像,都会被提取出来,而其他部分都会变成黑色。
实现艺术效果
前面,我们介绍了各种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()
运行之后,有点非主流的感觉。