Python 谱聚类、图像分割和特征向量

Python 谱聚类、图像分割和特征向量,python,image-processing,linear-algebra,image-segmentation,Python,Image Processing,Linear Algebra,Image Segmentation,基于《计算机视觉现代方法》一书第425页,我尝试使用特征向量进行图像分割 作者提到可以在矩阵A中捕获图像像素的仿射。然后我们可以最大化w^T A w乘积,其中w是权重。在一些代数中,我们得到Aw=\lambda w,找到w就像找到特征向量一样。然后找到最佳簇就是找到具有最大特征向量的特征值,该特征向量内的值就是簇成员值。我写了这段代码 import matplotlib.pyplot as plt import numpy as np Img = plt.imread("twoObj.jpg

基于《计算机视觉现代方法》一书第425页,我尝试使用特征向量进行图像分割

作者提到可以在矩阵A中捕获图像像素的仿射。然后我们可以最大化w^T A 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()
导入matplotlib.pyplot作为plt
将numpy作为np导入
Img=plt.imread(“twoObj.jpg”)
(n,假人)=Img.shape
Img2=Img.flatte()
(nn,)=Img2.shape
A=np.零((nn,nn))
对于范围内的i(nn):
对于范围内的j(nn):
N=Img2[i]-Img2[j];
A[i,j]=np.exp(-(N**2))
五、 D=np.linalg.eig(A)
V=np.实(V)
a=np.real(D[1])
阈值=1e-10#过滤器
a=np.重塑(a,(n,n))

Img[a我刚刚在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个特征向量的结果是:

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

不是每个人都有你提到的那本书的参考资料,所以如果你在网上提供一些关于这本书的链接,或者引用最相关的一段话,会更好(这可能属于术语范围。我刚刚分享了相关页面dumb问题:您是否检查了
nn
imread
可能会将图像读取为RGB,我不知道
flatte
是怎么回事。在Mathematica中,我必须首先将其转换为灰度。我刚刚检查了,特征值在numpy a中从最大到最小排序好的。我现在正在调试其余的。解决了!我必须使用展平(order='C')而不是展平()bcz展平的顺序必须与以后的重塑相匹配。这一点,我使用了threshold=0。另一方面,
numpy.linalg.eig
返回的特征值不能保证是有序的。(来自文档:
“特征值不一定是有序的……”
)通常会先得到最大的特征值,但这并不能保证。由于使用了迭代算法,它们通常是粗略排序的,但不要期望它们被排序。