LoginSignup
1
4

More than 5 years have passed since last update.

ステーキ定食の画像から物体を選別できないかやってみた - ④クラスタリング編

Last updated at Posted at 2017-06-14

はじめに

ステーキ定食の画像から物体を選別できないかやってみた - 類似画像検出編に引き続き、今回はヒストグラム比較した画像をクラスタリングしてみました。

ソースコード

※クラスタリング処理を抜粋

grouping_image.py
image_dir = "{ディレクトリパス}"
    target_files = os.listdir(image_dir)
    files = os.listdir(image_dir)

    group_images = {}

    for target_file in target_files:
        if target_file == '.DS_Store':
            continue

        # 画像ファイルを読み込みます。
        target_image_path = image_dir + target_file
        target_image = cv2.imread(target_image_path)

        # ヒストグラムデータを生成します。
        target_hist = cv2.calcHist([target_image], [0], None, [256], [0, 256])

        similarity_images = {}

        for file in files:
            if file == '.DS_Store' or file == target_file:
                continue

            # 画像ファイルを読み込みます。
            comparing_image_path = image_dir + file
            comparing_image = cv2.imread(comparing_image_path)

            # ヒストグラムデータを生成します。
            comparing_hist = cv2.calcHist([comparing_image], [0], None, [256], [0, 256])

            # ヒストグラム比較をして画像の類似度を算出します。
            ret = cv2.compareHist(target_hist, comparing_hist, 0)

            # 結果を確率表記に変換します。
            probability = ret * 100

            # 類似度を出力します。
            # print("target file: " + target_file, "file: " + file, "similarity: " + str(probability) + "%")

            # 類似度が90%以上のみグループ化します。
            if probability > 90:
                if len(target_file) not in group_images:
                    group_images[target_file] = {}

                similarity_images[len(similarity_images)] = file
                group_images[target_file].update(similarity_images)

    # 類似画像をグループ化します。
    similarity_group = {}

    for target_images in group_images:
        similarity_image = {}
        count = 0

        # 既にグループ化されている画像がないか確認します。
        if is_distinct_image(similarity_group, target_images):
            for similarity_images in group_images:
                if target_images != similarity_images:
                    distinct_images = {v:k for k, v in group_images[similarity_images].items()}

                    if target_images in distinct_images:
                        similarity_image[count] = similarity_images
                        count = count + 1

                        if target_images not in similarity_group:
                            similarity_group[target_images] = {}

                        similarity_group[target_images].update(similarity_image)

    # グループ化の結果を出力します。
    for file in similarity_group:
        print file, similarity_group[file]

# グループ化されている場合はFalseを返却します。
def is_distinct_image(similarity_group, target_images):
    for images in similarity_group:
        distinct_images = {v:k for k, v in similarity_group[images].items()}

        if target_images in distinct_images:
            return False

    return True

結果

634.jpg {0: '632.jpg', 1: '657.jpg'}
575.jpg {0: '603.jpg', 1: '581.jpg', 2: '659.jpg', 3: '758.jpg', 4: '754.jpg', 5: '629.jpg'}
932.jpg {0: '799.jpg', 1: '659.jpg', 2: '815.jpg', 3: '492.jpg', 4: '921.jpg', 5: '658.jpg', 6: '920.jpg', 7: '974.jpg', 8: '629.jpg', 9: '1018.jpg', 10: '806.jpg', 11: '972.jpg'}
547.jpg {0: '559.jpg', 1: '463.jpg'}
480.jpg {0: '432.jpg'}
389.jpg {0: '432.jpg', 1: '250.jpg', 2: '369.jpg'}

詳細

6種類に分類されました。
内成功かつ取りたいものでわけられたのは、以下の2グループです。

タレグループ

634.jpg
634.jpg

632.jpg
632.jpg

※以下略

ご飯グループ

575.jpg
575.jpg

603.jpg
603.jpg

※以下略

感想

ほか、漬物、味噌汁、薬味はざっくばらんにくくられてしまいました。
おそらく、理由としては焼肉定食全体が移しだれている画像があり、それに引っ張られているのではないかとおもいます。

全ページリンク

1
4
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
1
4