LoginSignup
2
4

More than 3 years have passed since last update.

サイゼリヤの間違い探し(イタリア食材編)

Last updated at Posted at 2020-11-02

はじめに

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

s1.pngs2.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)    

diff.png

答え合わせ

分かりにくい箇所もありますが、全て検出できているようです。
ansfig.pngdiffans.png
ans.png

終わりに

シンプルな手法ですが間違い探しには十分使えそうな気がしています。もっと難しい課題にも挑戦してみます。

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