サイゼリヤの間違い探しをご存知でしょうか?
かなり難しいということで、ある意味、本業のイタリアンよりも有名ですよね。
真面目にトライしてみても、全く歯が立たなかったので、画像処理を使って解けるアルゴリズムを考えてみました。
サイゼリヤの間違い探しについて
難易度が高すぎるということで有名です。
いくつか公式サイトより引用させていただきたいと思います。
1. 難易度: やや難しい
(引用: https://www.saizeriya.co.jp/entertainment/1804.html)
2. 難易度: 難しい
(引用: https://www.saizeriya.co.jp/entertainment/vegetable.html)
3. 難易度: 激ムズ
(引用: https://www.saizeriya.co.jp/entertainment/oil.html)
難易度は私の主観でつけさせていただきました。
どうでしょうか?間違いは見つけられましたでしょうか?
「いや、難しいって…」って人がほとんどじゃないでしょうか?
この問題を簡単に解けるアルゴリズムを考えてみました。
プログラムについて
GitHubにimage-diffという名前でアップしました。
下記は、上記の問題に対してimage-diffを適用した結果です。
結果 1. 難易度: やや難しい
(引用: https://www.saizeriya.co.jp/entertainment/1804_answer.html)
はっきりと差分が出ていますね!
これはわかりやすいです。
結果 2. 難易度: 難しい
(引用: https://www.saizeriya.co.jp/entertainment/vegetable_answer.html)
上下の枠に差分が出ていますが、これもわかりやすいですね。
結果 3. 難易度: 激ムズ
(引用: https://www.saizeriya.co.jp/entertainment/oil_answer.html)
細かなノイズがたくさん出ており、どれが間違いかはパット見はわかりません。。
しかし、問題と比較しながらよく見ると、こちらもわかります。
使用方法
README.mdに記載させていただきました。
問題の画像を同じ大きさで2枚切り出して、下記のコマンドを入力するだけです。しばらく待つと、結果が表示されます。
python image_diff.py (画像1のパス) (画像2のパス)
うまく行かない場合は、オプション「-rx -ry」を使用して、画像を動かして探索を行ってみてください。(ただし、その場合は少し時間がかかります)
python image_diff.py -rx 5 -ry 5 (画像1のパス) (画像2のパス)
オプション「-rx -ry」はそれぞれX軸,Y軸に動かす範囲(px)です。詳細な説明は後述します。
もしくは、オプション「-th」を使用して行ってみてください。
python image_diff.py -th 50 (画像1のパス) (画像2のパス)
オプション「-th」は差分表示する色差の閾値です。1~255の範囲で変更できます。値を小さくすればするほど、差分が現れやすくなります。
仕組み
仕組みはとても簡単です。
左右の画像のピクセルを1つずつ比較し、一定以上の色差があった画素を差分として赤く表示しているだけです。
色差の閾値は、オプション「-th」で設定できます。
また、間違え探しの画像を上手く切り出せず、左右の画像がわずかにずれている場合は、画像を数ピクセル単位でずらして、何パターンかの比較を行います。
差分の画素の数の合計が最も少ないものを、最終的な結果として表示します。
その時の移動量(ピクセル)は、X座標, Y座標それぞれオプション「-rx」「-ry」で設定できます。
一応、マルチスレッドで動作するようになっています。オプション「-j」でスレッドの数を変更できます。
考察
原理上、色差が大きく現れないような「間違い」を探すのは大変難しいですね。これは課題ですね。。
今回は愚直に1ピクセルずつ色差を比較して間違いを探しましたが、ディープラーニングなどAIを活用すれば、もっと精度良く見つけられるかもと思いました。
コメント