###はじめに
OpenCVを使いサイゼリヤのイタリア食材の間違い探しをやってみました。
###画像切り出し(手動)
画像2枚について同一ピクセルサイズになるよう注意深く切り出し、png形式で保存します。
###ライブラリのインポート
OpenCVなどのライブラリをインポートします。
import os
import subprocess
from PIL import Image
import cv2
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
###画像サイズ調整
切り出した画像ファイルをdir1フォルダに格納します。次に、画像サイズを300*300pxにし、dir2フォルダに格納します。
dir1 = 'png'
dir2 = 'png_resize'
files1 = os.listdir(dir1)
files1.sort()
for file in files1:
if '.png' in file:
img0 = os.path.join(dir1, file)
img0_img = Image.open(img0)
img1_img = img0_img.resize((300,300))
img1 = os.path.join(dir2, file)
img1_img.save(img1)
print(file)
# s1.png
# s2.png
###画像分割
画像を縦横300分割してb値を取得します。分割数は300の約数ならばOKですが、Maxである300にすることで差分画像の精度が最高となります。
dir2 = 'png_resize'
files2 = os.listdir(dir2)
files2.sort()
std_data2 =[]
image_data2 = []
grid =300 #分割数
for file in files2:
if '.png' in file:
img = cv2.imread('./png_resize/' + file)
h, w, c = img.shape
v_split = grid
h_split = grid
_img = img[:h // v_split * v_split, :w // h_split * h_split]
image_data =[]
for h_img in np.vsplit(_img, v_split):
for v_img in np.hsplit(h_img, h_split):
b, g, r = cv2.split(v_img)
value = round(b.mean())/100
image_data.append(value)
image_data2.append(image_data)
###差分画像化
差分を求め画像化します。
image_array2 = np.array(image_data2)
dif_array = image_array2[0] - image_array2[1]
dif_image=dif_array.reshape(grid,grid)
plt.imshow(dif_image)
###答え合わせ
分かりにくい箇所もありますが、全て検出できているようです。
###終わりに
シンプルな手法ですが間違い探しには十分使えそうな気がしています。もっと難しい課題にも挑戦してみます。