はじめに
ステーキ定食の画像から物体を選別できないかやってみた - 類似画像検出編に引き続き、今回はヒストグラム比較した画像をクラスタリングしてみました。
ソースコード
※クラスタリング処理を抜粋
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グループです。
タレグループ
※以下略
ご飯グループ
※以下略
感想
ほか、漬物、味噌汁、薬味はざっくばらんにくくられてしまいました。
おそらく、理由としては焼肉定食全体が移しだれている画像があり、それに引っ張られているのではないかとおもいます。