2013-08-06 78 views
0

我想計算一個數據集的一般PCA矩陣,我將用它來減少篩選描述符的維數。我已經找到了一些算法來計算它,但是我找不到用MATLAB來計算它的方法。計算一組篩選描述符的PCA矩陣

有人可以幫助我嗎?

回答

1
[coeff, score] = princomp(X) 

是正確的做法,但知道如何使用它有點棘手。


我的理解是,你不喜歡的東西:

sift_image = sift_fun(img) 

它給你一個二進制圖像:sift_feature? (即使不是二進制,這仍然工作。)

輸入,配製X:

要使用princomp/pca制訂X,使得每個列是numel(sift_image)×1向量
(即sift_image(:)
對所有圖像都進行此操作,並將它們排列爲X中的列。
因此,X將爲numel(sift_image) x num_images。

如果你的圖像尺寸不一樣(例如像素尺寸不同,圖像中或多或少的場景),那麼你需要將它們帶入一個共同的空間,這是一個完全不同的問題。

除非你的東西是二進制的,否則你可能想要在列方向(即標準化每個單獨的圖像)和行方向(取決於整個數據集)上對X進行去平均/歸一化。

輸出

score是一組本徵矢量:這將是num_pixels * NUM_IMAGES。 得到的,說的第一特徵向量回的圖像形狀,這樣做:

first_component = reshape(score(:,1),size(im)); 

等了組件的其餘部分。有和輸入圖像一樣多的組件。

coeff的每一行是可以應用於生成每個輸入圖像的num_images(等於num_components)權重集。即

input_image_1 = reshape(score * coeff(:,1) , size(original_im)); 

其中input_image_1是正確的,原來的形狀
係數_(1,:)是一個矢量(NUM_IMAGES×1)
得分是像素×NUM_IMAGES
(聲明:我可以具有的列/行混在一起,但描述是正確的。)

這有幫助嗎?

+0

感謝您提供真正有用的解釋,但是我能做些什麼來將圖片帶入公共空間? – oulcan

+0

使它們進入同一個空間的目標是它們具有相同的尺寸(像素/體素尺寸)並對齊(又名註冊)。 – Frederick

+0

(...從最後發表的帖子...)根據你的數據,這可能很容易。 MATLAB有一些內置的東西(http://www.mathworks.com/help/images/ref/imregister.html),我在這裏看到了堆棧溢出的一些東西。我處理醫學圖像,並使用專爲這些問題設計的工具。 – Frederick

1

如果您有權訪問統計工具箱,則可以使用命令princomp,或在最近的版本中使用命令pca

+0

我知道princomp函數,但問題是我無法得到「n-by-p數據矩陣X」部分。我有一個圖像數據集,我用vl_sift函數逐個提取它們的sift描述符。在這種情況下,數據矩陣X會是什麼? – oulcan

+0

我不知道 - 這取決於你如何收集篩選描述符以及你打算如何處理它們。通常對於PCA,你有'n'個對象,你已經收集了'p'個變量,並且你將'p'變量減少爲'q',其中'q << p'。也許你有'n'圖像,每個都有'p' sift描述符測量?或者也許你有一個帶有'n'區域的單一圖像,每個區域都帶有'p'描述符? –