4

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番目の値を試しました。しきい値は試行錯誤によって選択されました。このアルゴリズムをどのように改善できるかについてのアイデアはありますか?

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

4

1 に答える 1

2

私はMathematicaでアルゴリズムを試したところですが、それはあなたの画像でうまく機能するので、あなたのコードには微妙なバグがあるに違いありません。

この部分:

V,D = np.linalg.eig(A)
V = np.real(V)
res = n_max(V,1) # take largest 
idx = res[0][1][0] 
a = np.real(D[idx]) # look at corresp eigv

奇妙に見えます:私が知っているすべての線形代数パッケージは、ソートされた固有値/固有ベクトルを返すので、リストの最初の固有ベクトルを取得するだけです。これが、最も高い固有値に対応するものです。固有値リストをプロットして、それを確認してみてください。

また、どこから固定しきい値を取得しましたか?画像を正規化して表示してみましたか?

価値があるので、最初の3つの固有ベクトルに対して得られる結果は次のとおりです。

Eigenvector1 Eigenvector2 Eigenvector3

これは私が使っているMathematicaコードです:

pixels = Flatten[image];
weights = Table[N[Exp[-(pixels[[i]] - pixels[[j]])^2]], {i, 1, 900}, {j, 1, 900}];
eigenVectors = Eigenvectors[weights];
ImageAdjust[Image[Partition[eigenVectors[[1]], 30]]]
于 2011-07-23T10:27:27.217 に答える