문제

이미지의 픽셀 강도의 유사성을 나타내는이 행렬 A가 있습니다. 예를 들어 : 고려하십시오 10 x 10 영상. 이 경우 행렬 A는 차원입니다 100 x 100, 및 요소 A (I, J)는 범위 0에서 1의 값을 가질 것이며, 이는 강도 측면에서 픽셀 I의 유사성을 나타냅니다.

이미지 처리에 OpenCV를 사용하고 있으며 개발 환경은 Linux의 C입니다.

목표는 행렬 A의 고유 벡터를 계산하는 것이며 다음은 다음과 같습니다.

static CvMat mat, *eigenVec, *eigenVal;
static double A[100][100]={}, Ain1D[10000]={};
int cnt=0;

//Converting matrix A into a one dimensional array
//Reason: That is how cvMat requires it
for(i = 0;i < affnDim;i++){
  for(j = 0;j < affnDim;j++){
 Ain1D[cnt++] = A[i][j];
  }
}

mat = cvMat(100, 100, CV_32FC1, Ain1D); 

cvEigenVV(&mat, eigenVec, eigenVal, 1e-300);

for(i=0;i < 100;i++){
  val1 = cvmGet(eigenVal,i,0); //Fetching Eigen Value

  for(j=0;j < 100;j++){   
 matX[i][j] = cvmGet(eigenVec,i,j); //Fetching each component of Eigenvector i    
  }
}

문제: 실행 후 모든 고유 벡터의 거의 모든 구성 요소가 0이됩니다. 다른 이미지를 시도하고 0과 1 사이의 임의 값으로 A를 채우려고했지만 동일한 결과를 얻었습니다.

반환 된 상단 고유 값 중 일부는 다음과 같습니다.

9805401476911479666115491135488.000000  
-9805401476911479666115491135488.000000  
-89222871725331592641813413888.000000  
89222862280598626902522986496.000000  
5255391142666987110400.000000

나는 지금 사용 라인을 생각하고 있습니다 cvsvd () 실제 부동 소수점 매트릭스의 단일 값 분해를 수행하고 고유 벡터를 생성 할 수 있습니다. 그러나 그 전에 나는 여기서 그것을 묻는 생각을했다. 내 현재 접근 방식에 터무니없는 것이 있습니까? 올바른 API를 사용하고 있습니까? cveigenvv () 올바른 입력 행렬의 경우 (내 행렬 A는 부동 소수점 매트릭스)?

건배

도움이 되었습니까?

해결책

독자에 대한 참고 사항 :이 게시물은 처음에는 주제와 관련이없는 것처럼 보이지만 위의 의견에서 토론을 참조하십시오.

다음은 그것을 구현하려는 시도입니다 스펙트럼 클러스터링 이미지 픽셀에 적용된 알고리즘 MATLAB. 나는 정확히 따랐다 종이 @andriyev에 의해 언급 :

Andrew NG, Michael Jordan 및 Yair Weiss (2002). 스펙트럼 클러스터링 : 분석 및 알고리즘. T. Dietterich, S. Becker 및 Z. Ghahramani (Eds.), 신경 정보 처리 시스템의 발전 14. Mit Press

코드:

%# parameters to tune
SIGMA = 2e-3;       %# controls Gaussian kernel width
NUM_CLUSTERS = 4;   %# specify number of clusters

%% Loading and preparing a sample image
%# read RGB image, and make it smaller for fast processing
I0 = im2double(imread('house.png'));
I0 = imresize(I0, 0.1);
[r,c,~] = size(I0);

%# reshape into one row per-pixel: r*c-by-3
%# (with pixels traversed in columwise-order)
I = reshape(I0, [r*c 3]);

%% 1) Compute affinity matrix
%# for each pair of pixels, apply a Gaussian kernel
%# to obtain a measure of similarity
A = exp(-SIGMA * squareform(pdist(I,'euclidean')).^2);

%# and we plot the matrix obtained
imagesc(A)
axis xy; colorbar; colormap(hot)

%% 2) Compute the Laplacian matrix L
D = diag( 1 ./ sqrt(sum(A,2)) );
L = D*A*D;

%% 3) perform an eigen decomposition of the laplacian marix L
[V,d] = eig(L);

%# Sort the eigenvalues and the eigenvectors in descending order.
[d,order] = sort(real(diag(d)), 'descend');
V = V(:,order);

%# kepp only the largest k eigenvectors
%# In this case 4 vectors are enough to explain 99.999% of the variance
NUM_VECTORS = sum(cumsum(d)./sum(d) < 0.99999) + 1;
V = V(:, 1:NUM_VECTORS);

%% 4) renormalize rows of V to unit length
VV = bsxfun(@rdivide, V, sqrt(sum(V.^2,2)));

%% 5) cluster rows of VV using K-Means
opts = statset('MaxIter',100, 'Display','iter');
[clustIDX,clusters] = kmeans(VV, NUM_CLUSTERS, 'options',opts, ...
    'distance','sqEuclidean', 'EmptyAction','singleton');

%% 6) assign pixels to cluster and show the results
%# assign for each pixel the color of the cluster it belongs to
clr = lines(NUM_CLUSTERS);
J = reshape(clr(clustIDX,:), [r c 3]);

%# show results
figure('Name',sprintf('Clustering into K=%d clusters',NUM_CLUSTERS))
subplot(121), imshow(I0), title('original image')
subplot(122), imshow(J), title({'clustered pixels' '(color-coded classes)'})

... 그리고 간단한 집 이미지를 사용하여 페인트로 그린 결과는 다음과 같습니다.

laplacian matrix image clustered

그건 그렇고, 사용 된 첫 4 개의 고유 값은 다음과 같습니다.

1.0000
0.0014
0.0004
0.0002

그리고 상응하는 고유 벡터 [길이 r*c = 400의 열] :

-0.0500    0.0572   -0.0112   -0.0200
-0.0500    0.0553    0.0275    0.0135
-0.0500    0.0560    0.0130    0.0009
-0.0500    0.0572   -0.0122   -0.0209
-0.0500    0.0570   -0.0101   -0.0191
-0.0500    0.0562   -0.0094   -0.0184
......

질문에서 언급하지 않은 위에서 수행 한 단계가 있습니다 (라플라시안 매트릭스 및 행 정규화).

다른 팁

나는 이것을 추천 할 것이다 기사. 저자는 얼굴 인식을 위해 고유 한 얼굴을 구현합니다. 4 페이지에서 Cvcalceigenobjects를 사용하여 이미지에서 고유 벡터를 생성한다는 것을 알 수 있습니다. 이 기사 에서이 계산에 필요한 전체 사전 처리 단계가 표시됩니다.

도움이되지 않는 답변은 다음과 같습니다.

이론 (또는 종이에 낙서 한 수학)은 고유 벡터가 무엇을 말해야한다고 말합니까? 약.

다른 도서관은 고유 벡터가 무엇을 말해야합니까? 이상적으로 Mathematica 또는 Maple과 같은 시스템 (임의의 정밀도로 계산하도록 설득 될 수 있음)은 고유 벡터가 있어야한다고 말하는 것은 무엇입니까? 최소한 테스트 크기의 문제에 대한 생산량이 많은 문제가 아닌 경우.

나는 이미지 처리 전문가가 아니기 때문에 훨씬 더 도움이 될 수는 없지만 과학자들과 많은 시간을 보내고 경험은 수학을 먼저하고 형성함으로써 많은 눈물과 분노를 피할 수 있다고 가르쳐주었습니다. 왜 당신이 어떤 결과를 얻을 수 있는지 궁금해하기 전에 어떤 결과를 얻을 수 있는지에 대한 기대. 물론 알고리즘 구현에 오류가 될 수 있습니다. 정밀도 또는 기타 수치 문제가 손실 될 수 있습니다. 그러나 당신은 아직 그 문의 라인을 모르고 후속 조치를 취해서는 안됩니다.

문안 인사

표시

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top