MathematicaでWaldoを見つけるにはどうすればよいですか?


1542

これは週末に私を悩ませていました:Waldoのそれらを解決する良い方法は何ですか? [ 北米以外の「ウォーリー」 ] Mathematica(画像処理およびその他の機能)を使用したパズル?

これが私がこれまで持ってきたものであり、赤以外の色のいくつかを暗くすることによって視覚的な複雑さを少し軽減する関数です:

whereIsWaldo[url_] := Module[{waldo, waldo2, waldoMask},
    waldo = Import[url];
    waldo2 = Image[ImageData[
        waldo] /. {{r_, g_, b_} /;
          Not[r > .7 && g < .3 && b < .3] :> {0, 0,
          0}, {r_, g_, b_} /; (r > .7 && g < .3 && b < .3) :> {1, 1,
          1}}];
    waldoMask = Closing[waldo2, 4];
    ImageCompose[waldo, {waldoMask, .5}]
]

そして、これが「機能する」URLの例:

whereIsWaldo["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"]

(Waldoはレジのそばにあります):

元の画像

Mathematicaグラフィック


31
@yoda-左上、靴がたくさんあるテーブル、レジ、テーブルの隅にあるWaldo。
Arnoud Buzing

8
コンピュータービジョンの博士課程の学生として、私はこれを試してみようと非常に魅力的です...しかし、私は抵抗しなければなりません。この非常に影響力のある作業(警告:pdf)のように、「向きのあるヒストグラムのヒストグラム+スライディングウィンドウSVM」を使用する価値があります。
dimatura '19

54
ウォーリーはどこだ」>。<
2011

2
他の言語もサポートするように質問を変更できますか?私はMatlabでそれを行うことを考えました
Andrey Rubshtein

2
@ArnoudBuzing:あなたの質問では、最も白が多いセレクションを見て、Waldoを見つけることができます。:/
Tamara Wijsman 2012年

回答:


1640

ワルドを見つけました!

ワルドが見つかりました

どうやってやったか

まず、赤ではないすべての色を除外します

waldo = Import["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"];
red = Fold[ImageSubtract, #[[1]], Rest[#]] &@ColorSeparate[waldo];

次に、この画像と単純な白黒パターンとの相関を計算して、シャツの赤と白の遷移を見つけます。

corr = ImageCorrelate[red, 
   Image@Join[ConstantArray[1, {2, 4}], ConstantArray[0, {2, 4}]], 
   NormalizedSquaredEuclideanDistance];

Binarizeは画像内のピクセルを十分に高い相関関係で選び、それらの周りに白い円を描いて強調してDilation

pos = Dilation[ColorNegate[Binarize[corr, .12]], DiskMatrix[30]];

レベルを少しいじってみました。レベルが高すぎると、過剰な誤検出が選択されます。

最後に、この結果を元の画像と組み合わせて、上記の結果を取得します

found = ImageMultiply[waldo, ImageAdd[ColorConvert[pos, "GrayLevel"], .5]]

52
@MikeBantegui Heikeのソリューションは素晴らしいWhereIsWaldoですが、一般的なソリューションではないため、関数にパッケージ化するのはそれほど速くありません。平家自身は、あなたがポジティブになる前にレベルをいじる必要があると指摘しました。私が何を意味するかを確認するには、パッケージ化された関数をそのまま試してみてください"http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg"
abcd

17
この画像はトリッキーです:Waldo。でも、ワルドの可能性を強調できるものがあると便利だと思います(「有用」の定義の一部として)。(これにより、iPhotoが写真コレクションで顔として特定することを思い出します...)
ブレットチャンピオン

33
このメタポストを参照してください。meta.stackexchange.com/questions/116401/...
トカゲのビル

155
あなたはどこのワルドのルールを誤解しているようです。これは明らかに不正行為です。
Stefan Kendall

91
これはいいハックですが、うまくいきません。手動で調整する必要があり、1つのイメージでのみ機能します。これがなぜ賛成され、答えとして選ばれるのか、私にはわかりません。それは、他の誰もがより良い働き方で答えようとすることさえ阻止します。
sam hocevar '19

144

「これを実行するための防弾方法」(縞模様のシャツなどの競合する要素のない単一の画像だけでなく、いつでもCIAが衛星画像でWaldoを見つけることを考えてください)だと思います... ボルツマンマシンをWaldoの多くの画像でトレーニングします-座っている、立っている、閉塞しているなど、彼のすべてのバリエーション。シャツ、帽子、カメラ、その他すべての作品。Waldosの大規模なコーパスは必要ありません(おそらく3〜5で十分でしょう)。

これにより、正しい配置で発生するさまざまな要素に確率の雲が割り当てられ、平均的なオブジェクトサイズが(セグメンテーションによって)確立され、個々の人々に最も似ているオブジェクトのセルにソースイメージがフラグメント化されます(可能なオクルージョンとポーズの変更を考慮して) )、ただしWaldoの写真には通常、ほぼ同じスケールのLOTが含まれているため、これは非常に簡単な作業であり、事前にトレーニングされたボルツマンマシンのこれらのセグメントにフィードします。それぞれがワルドである確率をあなたに与えます。確率が最も高いものを選びます。

これが、今日のOCR、郵便番号リーダー、およびストロークのない手書き認識の仕組みです。基本的にあなたは答えがそこにあることを知っています、あなたはそれがどのように見えるべきか多かれ少なかれ知っています、そして他のすべては共通の要素を持っているかもしれませんが、間違いなく「そうではない」ので、あなたは「そうでない」と気にしないでください。以前に見た可能性のあるすべての「it」の中で「it」の可能性を確認するだけです(たとえば、郵便番号では、BMを1秒、2秒、3秒などでトレーニングし、それぞれにフィードします。各マシンに数字を入力し、最も信頼度の高いものを選択します。これは、すべての数値の単一のニューラルネットワーク学習機能よりもはるかにうまく機能します。


13
単純なニューラルネットワークだけで十分ではないでしょうか。さらに、ウィキペディアの記事は、ボルツマンマシンは実用的ではないと主張しています。
GClaramunt 2011

2
試さなくてもわかりませんが、十分に大きく複雑な場合は、ニューラルネットワークで十分です。特に繰り返しがある場合。ボルツマンマシンは、それ自体とは異なり、データの海に大量のノイズがあるかなり単純化されたデータのセットを認識するために非常に非常によく機能します。
Gregory Klopper、2011

14
郵便番号はBoltzmannマシンで常に読み取られ、郵便配達の正確性は非常に優れています。
Gregory Klopper、2011

47

@GregoryKlopperに同意します。任意の画像でWaldo(または対象のオブジェクト)を見つける一般的な問題を解決する正しい方法は、教師あり機械学習分類器をトレーニングすることです。多くのポジティブおよびネガティブラベル付きの例を使用して、サポートベクターマシンブーストデシジョンスタンプ、またはボルツマンマシンなどのアルゴリズムは、この問題で高精度を達成するようにトレーニングされる可能性があります。Mathematicaはその機械学習フレームワークにこれらのアルゴリズムを含めています。

Waldo分類器のトレーニングに関する2つの課題は次のとおりです。

  1. 適切な画像特徴変換を決定する。これが@Heikeの答えが役立つ場所です。赤いフィルターとストリップパターン検出器(たとえば、ウェーブレットまたはDCT分解)は、生のピクセルを分類アルゴリズムが学習できる形式に変換する良い方法です。画像のすべてのサブセクションを評価するブロックベースの分解も必要ですが、これは、Waldoがa)常にほぼ同じサイズであり、b)各画像に常に1回だけ存在するという事実により、簡単になります。
  2. 十分なトレーニング例を入手する。SVMは、各クラスの少なくとも100の例で最適に機能します。ブースティングの商用アプリケーション(デジタルカメラでの顔の焦点合わせなど)は、何百万ものポジティブおよびネガティブの例でトレーニングされています。

Googleの画像検索をすばやく実行すると、いくつかの優れたデータが見つかります。今すぐ、いくつかのトレーニング例を収集し、これをコーディングします。

ただし、機械学習アプローチ(または@iNDによって提案されたルールベースのアプローチ)でも、ランドオブウォルドスのような画像を探すのに苦労します。


実世界の「Where's Waldo」問題(つまり、Flickrで群衆の写真から特定の人物を見つける)を解決しようとする機械学習ベースのコンピュータービジョンシステムが、昨年のコンピュータービジョンとパターン認識の会議で発表されました。ただし、同じシーンの複数の写真を使用して3Dの位置情報を追加することにより、少しはだまします。
lubar

41

Mathematicaは知りません。。。残念な。しかし、私はほとんどの場合、上記の答えが好きです。

それでも、縞模様だけに頼って答えを収集することには大きな欠陥があります(個人的には1つの手動調整で問題はありません)。彼らが時々シャツのパターンを壊すことを示す例(ここでは Brett Championによってリストされています)が提示されています。したがって、それはより複雑なパターンになります。

空間関係とともに、形状IDと色のアプローチを試します。顔認識と同様に、特定の比率で幾何学的パターンを探すことができます。注意点は、通常、これらの形状の1つ以上が隠れていることです。

画像のホワイトバランスを取得し、画像の赤と赤のバランスを赤にします。Waldoは常に同じ値/色相であると思いますが、画像はスキャンからのものであるか、不良コピーである可能性があります。次に、常にWaldoの実際の色の配列を参照してください:赤、白、ダークブラウン、ブルー、ピーチ、{靴の色}。

シャツのパターンと、ウォルドを定義するパンツ、メガネ、髪、顔、靴、帽子があります。また、画像の他の人に比べて、ウォーリーはやせっぽちです。

だから、この写真で人の身長を取得するためにランダムな人を見つけてください。画像内のランダムなポイントでの束の平均の高さを測定します(単純な輪郭ではかなりの数の個人が生成されます)。それぞれが互いに標準偏差内にない場合、それらは今のところ無視されます。高さの平均を画像の高さと比較します。比率が大きすぎる場合(例、1:2、1:4、または同様に近い)、再試行してください。これを10(?)回実行して、サンプルがすべてかなり接近していることを確認し、標準偏差の範囲外の平均を除外します。Mathematicaで可能ですか?

これはあなたのWaldoサイズです。また、細いので、5:1または6:1(または何でも)ht:wdを探しています。ただし、これでは不十分です。Waldoが部分的に非表示になっている場合、高さが変わる可能性があります。だから、あなたは〜2:1の赤白のブロックを探しています。しかし、より多くの指標が必要です。

  1. ウォルドはメガネを持っています。赤白の上0.5:1の2つの円を検索します。
  2. 青パンツ。赤白の端と彼の足までの距離の間の任意の距離内で同じ幅にある任意の量の青。彼はシャツを短く着ているので、足が近すぎないことに注意してください。
  3. 帽子。頭頂部の2倍までの距離で赤白。髪が黒く、おそらく眼鏡が必要です。
  4. 長袖。メインの赤白からある角度で赤白。
  5. 黒髪。
  6. 靴の色。色がわかりません。

それらのどれでも適用できます。これらは、写真の中の類似の人物に対する否定的なチェックでもあります。たとえば、#2は赤白のエプロン(靴に近すぎる)の着用を否定し、#5は明るい色の髪を排除します。また、形状はこれらの各テストの1つの指標にすぎません。。。指定された距離内の色のみで良好な結果が得られます。

これにより、処理する領域が絞り込まれます。

これらの結果を格納する領域の集合を生成しますする必要があり、それにワルドを持っています。他のすべてのエリアを除外し(たとえば、エリアごとに、平均的な人のサイズの2倍の大きさの円を選択)、@ Heikeがレイアウトしたプロセスを実行して、赤以外のすべてを削除します。

これをコーディングする方法について何か考えはありますか?


編集:

これをコード化する方法についての考え。。。Waldo赤以外のすべての領域を除外し、赤い領域をスケルトン化し、それらを1つのポイントに切り詰めます。ウォルド髪の茶色、ウォルドパンツの青、ウォルド靴の色についても同じようにします。Waldoの肌の色を除外し、輪郭を見つけます。

次に、赤以外のすべての赤の領域を(大量に)拡張してから、スケルトン化して剪定します。この部分は、可能なウォルド中心点のリストを提供します。これは、他のすべてのWaldoカラーセクションと比較するマーカーになります。

ここから、(拡張された領域ではなく)スケルトンの赤い領域を使用して、各領域の線を数えます。正しい数(4つですよね)があれば、これは確かに可能な領域です。そうでない場合、私はそれを除外するだけだと思います(Waldoのセンターなので...まだ彼の帽子かもしれません)。

次に、上に顔の形、上にヘアポイント、下にパンツポイント、下に靴ポイントなどがあるかどうかを確認します。

まだコードはありません-まだドキュメントを読んでいます。


8
おそらく、慣れ親しんだシステムや言語で、概念実証を示すことができます。これはまた、あなたの難しさがでてくるかもしれない場所のための感じを与えるだろう。
サボルチ

1
ああ、私は現状のままチャレンジを楽しんでいます。それは私にビーチでの散歩と夕食のためのドレッシングの間に行う何かを与えます。
2012年

1
そう。。。なぜ反対票?これは、ここでの他の投機的な答えとどのように違うのですか?これは、この質問をもっと真剣に受け止めるべきだという提案ですか?それとも、私は私の調査でもっと深刻に見えるべきですか?私のアプローチは実際に間違っていますか?
2012年

3
私はあなたに反対票を投じなかったし、反対票は正直に答えようとする試みには適切ではないと思います(誤った情報を提供しない限り)。反対票の最も可能性の高い理由は、(非常に複雑なサウンドの)アプローチを試していないようであり、適切な解決策を見つけるには、かなりの量の実際的な実験を行い、多くのアイデアを除外することです。他の投機的な答えは、同様の問題に対して過去に使用されてきた一般的な方法(出発点として)を示唆しており、それにはかなりの量の文献があります。何が起こったのか説明しようとしています。
Szabolcs

説明ありがとう。私はアイデアの歴史に焦点を当てているのではないと思います。
2012年

2

OpenCVを使用してWaldoを見つけるための簡単な解決策があります。

私はOpenCVで利用可能なテンプレートマッチング関数を使用してWaldoを見つけました。

これを行うには、テンプレートが必要です。そこで、元の画像からWaldoをトリミングして、テンプレートとして使用しました。

ここに画像の説明を入力してください

次に、使用する方法として、正規化された相関係数cv2.matchTemplate()とともに関数を呼び出しました。下の白い部分(左上の領域のどこか)に示すように、単一の領域で高い確率を返しました。

ここに画像の説明を入力してください

最も可能性の高い領域の位置は、cv2.minMaxLoc()関数を使用して見つかりました。次に、関数を使用して四角形を描画し、ウォルドを強調表示しました。

ここに画像の説明を入力してください


7
SOの最も有名な画像処理の質問に取り組みますか?;)あなたの解決策は素晴らしくて簡単ですが、a /この特定の画像でのみ機能し、b /事前に見つけたいWaldoの正確な画像が必要です。あなたは通常のゲームをプレイします。とにかくこの質問はとても楽しいです
Soltius

@Solitus haまさに!!! 特にこの画像だけに働きました。別の画像で作業するのは難しいですが!!
Jeru Luke
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.