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

# はじめに

[ステーキ定食の画像から物体を選別できないかやってみた - 類似画像検出編](http://qiita.com/neriai/items/615c9233582a91a1396a)に引き続き、今回はヒストグラム比較した画像をクラスタリングしてみました。

# ソースコード

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

```py: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
```

# 結果

```zsh
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'}
```

## 詳細

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

### タレグループ

634.jpg
![634.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/c8cddbe2-a9ca-508c-ec10-00ffaa5342aa.jpeg)

632.jpg
![632.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/c18d0340-723e-afa8-cc56-e6d136c7b614.jpeg)

※以下略

### ご飯グループ

575.jpg
![575.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/1228c961-dd32-9ba0-eb8c-07b1375b5186.jpeg)

603.jpg
![603.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/243437c6-661c-0a2e-21c6-dc41fc9e3c0e.jpeg)

※以下略

## 感想

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

# 全ページリンク
- [PythonとOpenCVを使って物体検出をやってみた](http://qiita.com/neriai/items/448a36992e308f4cabe2)
- [ステーキ定食の画像から物体を選別できないかやってみた - ①物体検出編](http://qiita.com/neriai/items/d420b78f35033408ccda)
- [ステーキ定食の画像から物体を選別できないかやってみた - ②オーバーラップ数選別編](http://qiita.com/neriai/items/e718290e8b14b0594008)
- [ステーキ定食の画像から物体を選別できないかやってみた - ③類似画像ヒートマップ検出編](http://qiita.com/neriai/items/615c9233582a91a1396a)
- [ステーキ定食の画像から物体を選別できないかやってみた - ④クラスタリング編](http://qiita.com/neriai/items/6df233918513a51a7147)
- [ステーキ定食の画像から物体を選別できないかやってみた - ⑤類似画像特徴点検出編](http://qiita.com/neriai/items/e96d70fc3b89f050daa5)