昔どっかの番組で
松崎しげるさんがどんどん黒くなったらいつ気づくのか?
みたいな番組をやっていたのを思い出しました。

今回はopencvを使って
画像の一部分の黒さを濃くするプログラムを作ってみました。

解説動画はこちら



ソースコードはこちら

画像はご自身で用意してくださいね。

import cv2
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact, IntSlider
%matplotlib inline

def detect_red_color(img):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    hsv_min = np.array([0,64,0])
    hsv_max = np.array([30,255,255])
    mask1 = cv2.inRange(hsv, hsv_min, hsv_max)
    hsv_min = np.array([150,64,0])
    hsv_max = np.array([179,255,255])
    mask2 = cv2.inRange(hsv, hsv_min, hsv_max)    
    mask = mask1 + mask2
    masked_img = cv2.bitwise_and(img, img, mask=mask)
    return masked_img

img = cv2.imread(‘ファイルパス’)
red_masked_img = detect_red_color(img)
mask_img = cv2.cvtColor(red_masked_img, cv2.COLOR_BGR2RGB)

rate1 = IntSlider(min=1 , max=20,step=1,value=20)

@interact(rate1=rate1)
def plot(rate1):
    mask = mask_img  // 20 * rate1 
    mask[mask==0]=255
    height, width, color = img.shape
    for y in range(0, height):
        for x in range(0, width):
            if (mask[y][x] < 240).all():
                img[y][x] = mask[y][x]
    plt.figure(figsize=(16,9))
    plt.imshow(img)
    plt.show()

ファイルパスの部分だけ
ご自身で用意したファイルに差し替えれば
動くと思います。

このプログラムですが
画像の色味を見てその濃さを調整するので
できれば顔以外は真っ黒な方が望ましいです。

スライダーで黒みを調整できます。
初期値は20で
この時は0%です。

スライドを左にずらして行けば
5%ずつ濃くなっていきます。

MAXにしてみると
download-1

ぶっちゃけ誰か分かりません!!!!

プログラム内で何をやっているかと言うと
まず赤みを判定して
顔のマスク部分を作る関数があります。

赤みの部分だけ抽出し
その濃さをスライダーの値から
計算して黒に近づけます。

画像は取り込んだ際に
配列で取り込まれているので
データ上は数値です。

RGB値だと
黒は0,0,0
白は255,255,255です。

単純に数値を
割って小さくすれば
黒に近づきます。

最後にマスク部分だけ
元の画像の色と入れ替えて表示
と言うことだけやっている
シンプルなプログラムです。

他の画像でも
色味を変えることはできますので
色々な方々でやってみてください。

本日はこれまで
それでは