سؤال

لدي هذه المصفوفة A، التي تمثل أوجه التشابه في شدة البكسل في الصورة.على سبيل المثال:اعتبر أ 10 x 10 صورة.المصفوفة A في هذه الحالة ستكون ذات بعد 100 x 100, ، والعنصر A(i,j) سيكون له قيمة في النطاق من 0 إلى 1، وهو ما يمثل تشابه البكسل i مع j من حيث الكثافة.

أنا أستخدم OpenCV لمعالجة الصور وبيئة التطوير هي C على Linux.

الهدف هو حساب المتجهات الذاتية للمصفوفة 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    
  }
}

مشكلة: بعد التنفيذ، أحصل تقريبًا على جميع مكونات جميع المتجهات الذاتية لتكون صفرًا.لقد جربت صورًا مختلفة وحاولت أيضًا ملء A بقيم عشوائية تتراوح بين 0 و1، ولكن النتيجة نفسها.

تبدو بعض القيم الذاتية العليا التي تم إرجاعها كما يلي:

9805401476911479666115491135488.000000  
-9805401476911479666115491135488.000000  
-89222871725331592641813413888.000000  
89222862280598626902522986496.000000  
5255391142666987110400.000000

أنا أفكر الآن في خطوط الاستخدام كفسفد () الذي يقوم بتحليل القيمة المفردة لمصفوفة الفاصلة العائمة الحقيقية وقد يعطيني المتجهات الذاتية.ولكن قبل ذلك فكرت في طرحه هنا.هل هناك أي شيء سخيف في نهجي الحالي؟هل أستخدم واجهة برمجة التطبيقات الصحيحة، أي؟ cvEigenVV() لمصفوفة الإدخال الصحيحة (المصفوفة A هي مصفوفة النقطة العائمة)؟

هتافات

هل كانت مفيدة؟

المحلول

ملاحظة للقراء:قد يبدو هذا المنشور للوهلة الأولى غير ذي صلة بالموضوع، ولكن يرجى الرجوع إلى المناقشة في التعليقات أعلاه.

فيما يلي محاولتي لتنفيذ التجميع الطيفي الخوارزمية المطبقة على بكسلات الصورة ماتلاب.لقد تابعت بالضبط ورق ذكره @Andriyev:

أندرو نغ، مايكل جوردان، ويائير فايس (2002).على التجمع الطيفي:التحليل والخوارزمية.في تي.ديتريش، س.بيكر، و Z.Ghahramani (محرران) ، التقدم في أنظمة معالجة المعلومات العصبية 14.مطبعة معهد ماساتشوستس للتكنولوجيا

الرمز:

%# 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
......

لاحظ أن هناك خطوات تم تنفيذها أعلاه لم تذكرها في سؤالك (مصفوفة لابلاس وتطبيع صفوفها)

نصائح أخرى

أود أن أوصي بهذا شرط.يطبق المؤلف Eigenfaces للتعرف على الوجوه.في الصفحة 4 يمكنك أن ترى أنه يستخدم cvCalcEigenObjects لإنشاء المتجهات الذاتية من الصورة.تعرض المقالة خطوة المعالجة المسبقة الكاملة اللازمة لهذه الحسابات.

إليك إجابة ليست مفيدة جدًا:

ما الذي تخبرك به النظرية (أو الرياضيات المكتوبة على قطعة من الورق) عن المتجهات الذاتية التي يجب أن تكون؟تقريبًا.

ماذا تخبرك مكتبة أخرى عن المتجهات الذاتية التي يجب أن تكون؟من الناحية المثالية، ما الذي يخبرك به نظام مثل Mathematica أو Maple (الذي يمكن إقناعه بالحساب بدقة اعتباطية) بشأن المتجهات الذاتية التي يجب أن تكون؟إن لم يكن لمشكلة الإنتاج الستة على الأقل لمشكلة بحجم الاختبار.

أنا لست خبيرًا في معالجة الصور، لذا لا يمكنني أن أكون أكثر فائدة، لكنني أقضي الكثير من الوقت مع العلماء وقد علمتني التجربة أنه يمكن تجنب الكثير من الدموع والغضب عن طريق إجراء بعض العمليات الحسابية أولاً والتكوين توقع النتائج التي يجب أن تحصل عليها قبل أن تتساءل عن سبب حصولك على الصفر في كل مكان.من المؤكد أنه قد يكون خطأ في تنفيذ الخوارزمية، أو قد يكون فقدان الدقة أو بعض المشاكل الرقمية الأخرى.لكنك لا تعرف ولا يجب عليك متابعة خطوط الاستفسار هذه بعد.

يعتبر

علامة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top