週1でお世話になるサイゼリア

好きなメニューは
青豆の温サラダ

これがあるから
サイゼリアは止められない!!!!

そんなサイゼリアさんで
いつも話題に上がるのが

サイゼリアの間違い探し
難しすぎ問題


普段そんなに
間違い探しとかに気を取られないが

注文したメニューが来るまでは
考えちゃいますよねーー

そんな間違い探しを
プログラムの力で解いてみたい
という挑戦です。

動画はこちら




まずは
元の画像をサイゼリアさんの公式ページから
お借りしてきました。

間違い探し

saize201810

これが間違い探しの問題の画像です。

これは1200 x 578ピクセルのサイズでした。

これを
左右を同じサイズで切り取って
そのピクセルを比較すれば、
間違い探しの答えが浮かび上がるのではないか?

そう考えたわけです。

まずは
左右二つの画像に切り分けます。

Pythonでは画像を取り扱うライブラリもあるので
それが使えます。

まずはライブラリのインポート
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

im = Image.open('saize201810.png')
rgb_im = im.convert('RGB’)
PILというライブラリで画像を取り込み
描画用にmatplotlibを使います。

matplotlibの画像を描画させるのに
numpyのarrayでなければならないので
numpyも読み込み

matplotlibを
インラインで表示させたいので指定します。

画像をとりこんだあとは
左右に切り分けます。
im1 = Image.new('RGB',(572,578))
im2 = Image.new('RGB',(572,578))

for x in range(0,572):
    for y in range(578):
        r,g,b = rgb_im.getpixel((x+28,y))
        im1.putpixel((x,y),(r,g,b))
        
for x in range(601,1173):
    for y in range(578):
        r,g,b = rgb_im.getpixel((x,y))
        im2.putpixel((x-601,y),(r,g,b))

plt.imshow(np.array(im1))
plt.imshow(np.array(im2))

左右に余白があり
マージンを取って取り込みます。
ピクセルのRGB値を取得して
新たな画像として生成します。

左側

saize1

右側
saize2

次に
この画像のピクセル同士を比較します。

この問題の左右がコピーされていて
ほぼ同じものであったなら
そのピクセルの違う部分が答えなのではないかと

im3 = Image.new('RGB',(572,578))

for x in range(572):
    for y in range(578):
        r1,g1,b1 = im1.getpixel((x,y))
        r2,g2,b2 = im2.getpixel((x,y))
        if r1!=r2 or g1!=g1 or b1!=b2:
            im3.putpixel((x,y),(r1,g1,b1))
        else:
            im3.putpixel((x,y),(0,0,0))

plt.imshow(np.array(im3))

左右のピクセルを比較した結果
違っていればそのピクセルを
合っていれば黒で答えを作りました。

結果は・・・・

saize3

なんか
いろいろ写っちゃってるやないかーーい


左右は全くの同じではなく
少し違いがあるか、ズレが生じているようで

単純なピクセルの比較では
答えの部分だけを出すのは難しいようです。

一応、違いが大きいところは
色が付いているので
着目すれば10個の答えは出そうですが

うまく、結果だけを出す
アルゴリズムを考えないと
くっきりした答えには
たどり着けないですねーーー

うーん
画像は奥が深い

ということで
皆さん
サイゼでガッツリ食べながら
この問題を解いてみましょう(笑)