3
1

More than 1 year has passed since last update.

python,OpenCVでハムスター(キンクマ)と床材を見分けたい

Posted at

はじめに

キンクマハムスターと床材の色が似すぎているのでなんとかして切り分けたいと思います。

環境

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)


寝ているハムスターはギリギリ検出できていると言えそうな輪郭ですが、起きているハムスターの輪郭はかなりボロボロです。
背景の棚がかなり悪さをしている感じがします。

結果

床材とハムスターの境界をうまく生成できませんでした。
先に黒目や赤い鼻を色抽出して、その周辺を再びハムスター色で抽出するなど、もう一工程挟む必要がありそうです。

参考記事

Python, OpenCVで輪郭検出をしてみる

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1