今回はシルエット当てクイズとかに使われる
視力検査画像を作っていきたいと思います


解説動画はこちら


Opencvで視力検査の画像っぽいものを作ります

画像のシルエットを浮かび上がらせて
何のキャラかを当てるやーつですね
見えたら正常・・・ってな奴です

参考画像はこんな感じのものです

IMG_0252




今回はGoogle Colabで作業を行います


作業手順としては次の通りです
0.画像をGoogle Colabにアップロードしておく
1.画像を取り込む
2.シルエットを抽出する
3.下地画像を作る
4.下地にシルエットを合成する


画像の用意

まずはなんでも良いので
画像を用意しましょう

シルエットがうまく抽出できるように
背景が薄くて、個体が判別できるものが良いですね

これをファイル置き場に置いておきます



画像の読み込み

opencvで画像を取り込んでいきます

Opencvのインポート

import numpy as np
import cv2
import os
from IPython.display import display,Image
import matplotlib.pyplot as plt
%matplotlib inline


ライブラリのインポートが終わったら
画像を読み込みましょう

ファイル名やパスなどは
あわせる様に変えましょう

うまく取り込めていたら
画面に表示されます
# 画像を読み込む
file_path = "/content/ファイル名"
img = cv2.imread(file_path)

# 出力
out = cv2.imencode(".png", img)[1]
display(Image(out,width=300))


シルエットを抽出する

画像が取り込めたら
次はその画像のシルエットを抽出します

具体的な手法としては
白黒画像に変換して
閾値を調整しながら濃いところを
抜いていきます

threshold をうまく変えて
調整して抜いて下さい

# グレースケールに変換する。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 2値化する(thresholdを変えて、うまく抜いてね)
threshold = 120
ret, bin_img = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY)

# 出力
out = cv2.imencode(".png", bin_img)[1]
display(Image(out,width=300))

シルエット画像は
こんな感じになります
siru



下地の画像を用意する

合成用の下地となる
青い画像を作っていきます

サイズは元の画像のサイズになります

height = bin_img.shape[0]
width = bin_img.shape[1]
blank = np.zeros((height, width, 3))
blank += [0,0,255][::-1]
blank = blank.astype(np.uint8)

out = cv2.cvtColor(blank, cv2.COLOR_BGR2RGB)
plt.imshow(out)
plt.axis("off")
plt.show()
blue



下地にシルエットを合成する


最後に下地にシルエットを合成します

eye_test_value を変えると
シルエットの濃さを調整できるので
色々変えて試してみて下さい

eye_test_value = 100
for h in range(bin_img.shape[0]):
  for w in range(bin_img.shape[1]):
    v = bin_img[h][w]
    if v==0:
      blank[h][w][0] = blank[h][w][0] - eye_test_value

out = cv2.cvtColor(blank, cv2.COLOR_BGR2RGB)
plt.imshow(out)
plt.axis("off")
plt.show()
100

値を小さくしてみると

50

5

どこまで見えますかね

見えたらあなたの視力は正常です


シルエット画像や下地
濃さを調整すれば
色々楽しめそうな感じの画像が
いくらでも作れますね

opencvは便利なので
こういった画像加工を行いたい方は
是非参考にしてみてください

それでは