425ページの「コンピュータビジョンと現代のアプローチ」という本に基づいて、画像のセグメンテーションに固有ベクトルを使用しようとしました。
http://dl.dropbox.com/u/1570604/tmp/comp-vis-modern-segment.pdf
著者は、画像ピクセルの無限大を行列Aでキャプチャできると述べています。次に、w ^ TA w積を最大化できます。ここで、wは重みです。ある代数がAw=\ lambda wを取得した後、wを見つけることは固有ベクトルを見つけることに似ています。次に、最適なクラスターを見つけることは、最大の固有ベクトルを持つ固有値を見つけることです。その固有ベクトル内の値は、クラスターメンバーシップ値です。私はこのコードを書きました
import matplotlib.pyplot as plt
import numpy as np
Img = plt.imread("twoObj.jpg")
(n,dummy) = Img.shape
Img2 = Img.flatten()
(nn,) = Img2.shape
A = np.zeros((nn,nn))
for i in range(nn):
for j in range(nn):
N=Img2[i]-Img2[j];
A[i,j]=np.exp(-(N**2))
V,D = np.linalg.eig(A)
V = np.real(V)
a = np.real(D[1])
threshold = 1e-10 # filter
a = np.reshape(a, (n,n))
Img[a<threshold] = 255
plt.imshow(Img)
plt.show()
画像
これから得られる最良の結果は以下のとおりです。結果はもっと良くなると思います。
Numpyでは固有値が最大から最小にソートされています。最初の値を試しましたが、機能しませんでした。次に、次の結果を得るために2番目の値を試しました。しきい値は試行錯誤によって選択されました。このアルゴリズムをどのように改善できるかについてのアイデアはありますか?