これは週末に私を悩ませていました:それらを解決するための良い方法は何ですか Waldoはどこにありますか? [ 'Wally' 北米外]パズル、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はレジにあります):
私はWaldoを見つけました!
どうやったの
まず、赤ではない色をすべて除外しています
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]]
「これを行うための防弾方法」(CIAはいつでも任意の衛星画像でWaldoを見つけることができると思います。縞模様のシャツのように、競合する要素がない単一の画像ではないと思います)...私は Boltzmann machine Waldoの多くの画像 - 座っている、立っている、隠れている、などのすべてのバリエーション。シャツ、帽子、カメラ、そしてすべての作品。 Waldosの大規模なコーパスは必要ありません(おそらく3〜5で十分でしょう)が、もっと良いのです。
これは、正しい配置に関係なく発生するさまざまな要素に確率の雲を割り当て、次に平均的なオブジェクトサイズが何かを(セグメンテーションによって)確立し、ソースイメージを個々の人々に最も近いオブジェクトのセルに断片化します。しかし、Waldoの写真は通常、ほぼ同じ縮尺で多くの人を含んでいるので、これは非常に簡単な作業であるはずです。それから事前に訓練されたBoltzmannマシンのこれらのセグメントをフィードします。それはあなたに各自がWaldoである可能性をあなたに与えるでしょう。最も高い確率でそれを取りなさい。
これが、今日のOCR、Zipコードリーダー、およびストロークレス手書き文字認識の仕組みです。基本的には、答えがあること、多かれ少なかれそれがどのように見えるべきかを知っていること、そして他のすべてのものに共通の要素があるかもしれませんが、間違いなく "not it"なので、あなたは "not it"を気にしないでください。すべての可能な「これまで見たことがある」の中から「それ」の可能性を見てみましょう(たとえば、郵便番号では、BMを1秒、2秒、3秒などで訓練してから、それぞれを入力します)。これは、すべての数値の単一のニューラルネットワーク学習機能よりもはるかに優れています。
私は@GregoryKlopperに同意します。 right 任意の画像でWaldo(または関心のあるオブジェクト)を見つけるという一般的な問題を解決する方法は、教師付き機械学習分類器を訓練することです。多くの正と負のラベル付きの例を使用して、 Support Vector Machine 、 Boosted Decision Stump 、またはBoltzmann Machineなどのアルゴリズムをこの問題に対して高い精度を達成するように訓練することができます。 Mathematicaはこれらのアルゴリズムをその Machine Learning Framework にさえ含めています。
Waldo分類器のトレーニングに伴う2つの課題は次のとおりです。
簡単な Google画像検索 を使用すると、いくつかの優れたデータが得られます。今すぐトレーニングの例をいくつかまとめてコーディングしてみましょう。
ただし、機械学習によるアプローチ(または@iNDによって提案されたルールベースのアプローチ)でさえ、 Land of Waldos !のようなイメージには苦労します。
Mathematicaを知りません。 。 。残念な。しかし、ほとんどの場合、上記の答えが好きです。
それでも、ストライプを頼りにすることには大きな欠点がありますalone回答を収集するために(私は個人的にone手動調整に問題はありません)。例があります(Brett Championにリストされている here )。これは、時々シャツのパターンを分割することを示しています。そのため、より複雑なパターンになります。
空間の関係とともに、シェイプIDと色のアプローチを試みます。顔認識と同様に、相互に特定の比率で幾何学的パターンを探すことができます。警告は、通常、これらの形状の1つ以上が隠されていることです。
画像のホワイトバランスを取得し、画像から赤のバランスを取得します。 Waldoは常に同じ値/色相であると信じていますが、画像はスキャンからのものであるか、不良コピーである可能性があります。次に、Waldoの実際の色の配列を常に参照します:赤、白、濃い茶色、青、桃、{靴の色}。
シャツのパターンがあり、パンツ、メガネ、髪、顔、靴、帽子もあります。また、画像内の他の人と比べて、Waldoは細い側にいます。
だから、この写真の人々の身長を得るためにランダムな人々を見つけてください。画像内のランダムなポイントで物の束の平均の高さを測定します(単純なアウトラインでは、かなりの数の個人が生成されます)。各要素が互いに標準偏差内にない場合、現時点では無視されます。高さの平均を画像の高さと比較します。比率が大きすぎる(例:1:2、1:4、または同様に近い)場合は、再試行してください。 10(?)回実行して、サンプルがすべてかなり接近していることを確認します。標準偏差の範囲外の平均は除外します。 Mathematicaで可能ですか?
これがWaldoのサイズです。 Walsoも細いので、5:1または6:1(または何でも)ht:wdを探しています。ただし、これでは十分ではありません。 Waldoが部分的に隠れている場合、高さが変わる可能性があります。だから、あなたは〜2:1の赤白のブロックを探しています。しかし、より多くの指標が必要です。
それらのいずれも適用できます。これらは、写真の同様の人々に対する否定的なチェックでもあります。たとえば、#2は赤白のエプロンを履くことを否定し(靴に近すぎる)、#5は明るい色の髪を排除します。また、形状はこれらの各テストの1つの指標にすぎません。 。 。指定された距離内の色のみで、良い結果が得られます。
これにより、処理する領域が絞り込まれます。
これらの結果を保存すると、Waldが含まれるshouldの領域のセットが生成されます。他のすべての領域を除外し(たとえば、各領域で、平均的な人のサイズの2倍の大きさの円を選択します)、@ Heikeが赤以外のすべてを削除してレイアウトしたプロセスを実行します。
これをコーディングする方法についての考えはありますか?
編集:
これをコーディングする方法についての考え。 。 。 Waldoの赤以外のすべての領域を除外し、赤の領域をスケルトン化し、それらを単一のポイントにプルーニングします。 Waldoの髪の茶色、Waldoのパンツブルー、Waldoの靴の色についても同じことを行います。 Waldoのスキンカラーについては、除外してからアウトラインを見つけます。
次に、赤以外のすべての赤い領域を拡張(多数)し、スケルトン化してプルーニングします。このパートでは、可能なWaldoの中心点のリストを示します。これは、他のすべてのWaldoカラーセクションと比較するマーカーになります。
ここから、スケルトン化された赤い領域(膨張した領域ではない)を使用して、各領域の行をカウントします。正しい番号(4つ、正しい?)がある場合、これは確かに可能な領域です。そうでない場合は、それを除外するだけです(Waldoセンターであるため...。
次に、上に顔の形、上に髪のポイント、下にパンツのポイント、下に靴のポイントなどがあるかどうかを確認します。
まだコードはありません-まだドキュメントを読んでいます。
OpenCVを使用してWaldoを見つけるための簡単な解決策があります。
Waldoを見つけるためにOpenCVで利用可能な テンプレートマッチング 関数を使用しました。
これを行うにはテンプレートが必要です。そこで私はWaldoを元の画像から切り取り、それをテンプレートとして使用しました。
次に、私はcv2.matchTemplate()
関数を 正規化相関係数 と共に使用する方法として呼び出しました。下の白い部分(左上の領域のどこか)に示すように、単一の領域で高い確率を返しました。
最も可能性の高い領域の位置はcv2.minMaxLoc()
関数を使って見つけました。それから私はWaldoを強調するために長方形を描くのに使いました: