【问题标题】:computing PCA matrix for set of sift descriptors计算一组筛选描述符的 PCA 矩阵
【发布时间】:2013-08-07 12:23:06
【问题描述】:

我想为一个数据集计算一个通用的 PCA 矩阵,我将使用它来减少筛选描述符的维度。我已经找到了一些算法来计算它,但是我找不到使用 MATLAB 来计算它的方法。

有人可以帮助我吗?

【问题讨论】:

    标签: matlab sift pca


    【解决方案1】:

    如果您有权访问 Statistics Toolbox,则可以使用命令 princomp,或者在最近的版本中使用命令 pca

    【讨论】:

    • 我知道 princomp 函数,但问题是我无法获得“n-by-p 数据矩阵 X”部分。我有一个图像数据集,我用 vl_sift 函数一一提取了它们的筛选描述符。在这种情况下,数据矩阵 X 将是什么?
    • 我不知道——这取决于您如何收集筛选描述符以及您打算如何处理它们。通常使用 PCA,您有 n 对象,您已经收集了 p 变量,并且您将 p 变量减少到 q,其中 q<<p。也许你有n 图像,每个都测量了p 筛选描述符?或者,也许您有一个带有n 感兴趣区域的图像,每个图像都有p 描述符?
    【解决方案2】:
    [coeff, score] = princomp(X) 
    

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


    我的理解是你做了类似的事情:

    sift_image = sift_fun(img)
    

    它给你一个二进制图像:sift_feature? (即使不是二进制,这仍然有效。)

    输入,制定 X:

    要使用 princomp/pca 公式化 X,使得每一列都是 numel(sift_image) x 1 向量
    (即sift_image(:)
    对所有图像执行此操作,并将它们排列为 X 中的列。
    所以 X 将是 numel(sift_image) x num_images。

    如果您的图像尺寸不同(例如像素尺寸不同,图像中或多或少的场景),那么您需要将它们带到某个公共空间,这是一个完全不同的问题。

    除非你的东西是二元的,否则你可能想要在列方向(即对每个单独的图像进行归一化)和行方向(对整个数据集进行去意义)进行去均值/归一化。

    输出

    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 是正确的原始形状
    coeff(1,:) 是一个向量 (num_images x 1)
    分数是像素 x num_images
    (免责声明:我可能混淆了列/行,但描述是正确的。)

    这有帮助吗?

    【讨论】:

    • 感谢您的解释非常有帮助,但我该怎么做才能将图像带入公共空间?
    • 将它们带入同一空间的目的是使它们具有相同的大小(像素/体素尺寸)并且对齐(也称为注册)。
    • (...接上一篇文章...)根据您的数据,这可能很容易。 MATLAB 内置了一些东西 (mathworks.com/help/images/ref/imregister.html),我在这里看到了一些关于堆栈溢出的东西。我处理医学图像,并使用专为这些问题设计的工具。
    • 图像可能有不同数量的 SIFT 向量,那么在这种情况下,X 将如何构图?
    猜你喜欢
    • 2020-08-29
    • 1970-01-01
    • 2014-03-10
    • 2018-03-25
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2013-05-27
    • 2016-03-16
    相关资源
    最近更新 更多