基于《计算机视觉现代方法》第 425 页,我尝试使用特征向量进行图像分割。
http://dl.dropbox.com/u/1570604/tmp/comp-vis-modern-segment.pdf
作者提到可以在矩阵 A 中捕获图像像素亲和。然后我们可以最大化 w^TA w 乘积,其中 w 是权重。在某个代数得到 Aw = λ 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 中,特征值从大到小排序,我尝试了第一个,但不起作用,然后我尝试了第二个,结果如下所示。通过反复试验选择阈值。关于如何改进该算法的任何想法?