2013-08-06 49 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'描述符? –