1. ホーム
  2. python

[解決済み] PythonでWallyを見つけるにはどうしたらいいですか?

2023-06-29 15:15:46

質問

恥ずかしながら、この流れに乗ります :-)

インスピレーション Mathematica でWaldoを見つけるにはどうしたらよいでしょうか. とそのフォローアップである RでWaldoを見つける方法 のように、新しいpythonのユーザーとして、これがどのように行われるかを見てみたいと思っています。Rよりもpythonの方が適しているように思いますし、MathematicaやMatlabのようにライセンスについて心配する必要はありません。

下のような例では、明らかに単純にストライプを使うだけではうまくいかないでしょう。このような難しい例に対して、単純なルールベースのアプローチが機能するようにできれば、それは興味深いことです。

正しい答えは、元のスレッドで Gregory Klopper が提唱した Restricted Boltzmann Machine (RBM) のアプローチのような ML 技術を使わなければならないと思うので、 [machine-learning] タグを追加しています。このような pythonで利用可能なRBMのコード がありますが、明らかにそのアプローチには学習データが必要です。

2009 IEEE International Workshop on MACHINE LEARNING FOR SIGNAL PROCESSING (MLSP 2009)にて発表されました。 を実行したそうです。 データ解析コンペティションを開催しました。ウォーリーはどこだ? . トレーニングデータはmatlab形式で提供されています。なお、このサイトのリンクは切れていますが、データ(のアプローチのソースと一緒に Sean McLoone とその同僚が行ったアプローチのソースは はこちら (SCMのリンク参照)。手始めの1つの場所のようです。

どのように解決するのですか?

以下は mahotas

from pylab import imshow
import numpy as np
import mahotas
wally = mahotas.imread('DepartmentStore.jpg')

wfloat = wally.astype(float)
r,g,b = wfloat.transpose((2,0,1))

赤、緑、青の各チャンネルに分割します。以下は浮動小数点演算を使った方が良いので、先頭で変換します。

w = wfloat.mean(2)

w は白チャンネルです。

pattern = np.ones((24,16), float)
for i in xrange(2):
    pattern[i::4] = -1

縦軸に+1,+1,-1,-1のパターンを作り上げる。これはウォーリーのシャツです。

v = mahotas.convolve(r-w, pattern)

赤から白を引いた色で畳みます。これでシャツの位置が強く反応するようになります。

mask = (v == v.max())
mask = mahotas.dilate(mask, np.ones((48,24)))

最大値を探して、それが見えるように拡張する。ここで、注目の領域を除いて、画像全体をトーンダウンします。

wally -= .8*wally * ~mask[:,:,None]
imshow(wally)

そして、次のようになります。 !