4

基于《计算机视觉现代方法》第 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 中,特征值从大到小排序,我尝试了第一个,但不起作用,然后我尝试了第二个,结果如下所示。通过反复试验选择阈值。关于如何改进该算法的任何想法?

在此处输入图像描述

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 个特征向量的结果是:

特征向量1 特征向量2 特征向量3

这是我使用的 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 回答