Я только что попробовал алгоритм в 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]]]