肌の色をマークする
以前、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()
実行した後、それは少し非主流に感じます。