きよぽん=サンのブログ

プログラミングを中心に。C++.Java,Perlなど

python + opencv で肌色を検出して褐色にするだけ

の簡単な作業をしてみた。

考え方

  1. 肌色領域のマスク画像を生成
  2. マスク画像から肌色部分を褐色にする
  3. 簡単

 

やってみる

肌色領域の検出

歴代の先人達がよしなにやってくれている

顔検出に必要なxmlを拝借し、ぱろすけさんが書いたコードを参考にするとできる

 

マスク画像から肌色部部分を褐色にする

画素値をいじる簡単なお仕事

def blown_skin_mask(im, mask):
    height, width = im.shape[:2]
    hsv_im = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
    for y in range(height):
        for x in range(width):
            if (mask[y, x, 0]):
                h = hsv_im[y, x, 0]
                s = hsv_im[y, x, 1]
                if (h < 8):
                    hsv_im[y, x, 0] = h + 180 - 8
                else:
                    hsv_im[y, x, 0] -= 8
                if (s < 212):
                    hsv_im[y, x, 1] += 43
                else:
                    hsv_im[y, x, 1] = 255
    return cv2.cvtColor(hsv_im, cv2.COLOR_HSV2BGR)

元画像と肌色領域のマスク画像をもらって、マスクの部分だけHSVをいじる

HSVの値はお好みの褐色具合で、個人的には (h,s,v)=(15,180,230)くらいが健康的な褐色で好き

 

コード全体

gistに載せておいた

detect_skin_and_blown.md

 

やってみる

次の画像に試してみる

f:id:kiyoponb:20150215205705j:plain

 

 結果を並べてみる

f:id:kiyoponb:20150215205728j:plain

 

肌色領域がまだまだ改善できそうな感じです

 

今回はここらへんで終わり

カッショクゴキゲンヨウジョ!!