はじめに
キンクマハムスターと床材の色が似すぎているのでなんとかして切り分けたいと思います。
環境
windows10
python3.9.4
opencv-python 4.5.5.62
numpy 1.20.2
HSVで色抽出してみる
とりあえず我が家のハムスターを適当に画像処理します。
ここではOpenCVを使いました。
詳細
インポート
import numpy as np
import cv2
ライブラリのインポートをします。
画像読み込み
# ファイル読み込み
filename = 'あなたのハムスター.jpg'
imageOriginal = cv2.imread(filename)
# リサイズ
imageResize = scaleToWidth(imageOriginal, 500)
# 横幅を基準に画像をリサイズ アスペクト比はかわらない
def scaleToWidth(img, width):
h, w = img.shape[:2]
height = round(h*(width/w))
dst = cv2.resize(img, dsize=(width, height))
return dst
画像を読み込みます。ついでにリサイズもしておきます。
色の抽出
# ぼかし
imageBlur = cv2.GaussianBlur(imageResize, (15, 15), 3)
#ハムスター色のマスクを作る
hsvLower = np.array([0/2, 0*2.55, 0*2.55]) # 抽出色の下限
hsvUpper = np.array([80/2, 50*2.55, 100*2.55]) # 抽出色の上限
#imageBlurを対象に色抽出
hamster = hsvExtraction(imageBlur, hsvLower, hsvUpper)
# HSVで特定の色を抽出する関数
def hsvExtraction(image, hsvLower, hsvUpper):
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 画像をHSVに変換
hsv_mask = cv2.inRange(hsv, hsvLower, hsvUpper) # HSVからマスクを作成
result = cv2.bitwise_and(image, image, mask=hsv_mask) # 元画像とマスクを合成
return result
画像をぼかした後、ハムスターっぽい色のみを抽出します。
抽出されたハムスター達
抽出されたハムスタ―達がこちらです。
適当にクリーム色で抽出したのハムスターの耳が消えてしまいました。
よくみると目も消えてドキドキ文芸部のようになってしまっています。
ネガポジ反転して二値化してみる
ネガ画像にする
imageNega = cv2.bitwise_not(hamster)
グレースケールにして二値化する
imageGray=cv2.cvtColor(imageNega,cv2.COLOR_BGR2GRAY)
ret,imageBinary=cv2.threshold(imageGray,90,255,cv2.THRESH_BINARY)
一度グレースケールにした後二値化したものがこちらです。
なんだかハムスターの概念的な物が見えてきました。
輪郭を検出する
contours, hierarchy = cv2.findContours(
imageBinary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
img_contour = cv2.drawContours(imageResize, contours, -1, (0, 0, 255), 2)
寝ているハムスターはギリギリ検出できていると言えそうな輪郭ですが、起きているハムスターの輪郭はかなりボロボロです。
背景の棚がかなり悪さをしている感じがします。
結果
床材とハムスターの境界をうまく生成できませんでした。
先に黒目や赤い鼻を色抽出して、その周辺を再びハムスター色で抽出するなど、もう一工程挟む必要がありそうです。