はじめに
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)    
答え合わせ
終わりに
シンプルな手法ですが間違い探しには十分使えそうな気がしています。もっと難しい課題にも挑戦してみます。





