【问题标题】:Compute PCA with ITK in C++在 C++ 中使用 ITK 计算 PCA
【发布时间】:2021-04-23 13:37:28
【问题描述】:

我正在处理一些 DICOM 图像,为此我使用 ITK。我想计算肿瘤二值图像的 PCA。我找到并尝试使用 ImagePCADecompositionCalculator 类,但无法检索均值、特征值或特征向量。它似乎只用于创建一些包含多个图像的统计形状模型。

void PCA(DICOMImage image) {

    using FilterType = itk::ImagePCADecompositionCalculator<ImageType>;

    FilterType::Pointer filter = FilterType::New();
    filter->SetImage(image.getImage());
    filter->Compute();

    qDebug() << filter->GetReferenceCount();
    // how to retrieve mean, eigenvalues and eigenvectors?
}

我也尝试过使用openCV,但是结果很奇怪。

typedef itk::Point<double, 3> PointType;    
PCA computePCA(vector<PointType> coords) {

    qDebug() << "computing PCA with" << coords.size() << "elements";
    Mat data = Mat(int (coords.size()), 3, CV_32F);

    for (size_t i = 0; i < coords.size(); ++i) {
        data.at<double>(int (i), 0) = coords.at(i)[0];
        data.at<double>(int (i), 1) = coords.at(i)[1];
        data.at<double>(int (i), 2) = coords.at(i)[2];
    }
    
    PCA pca(data, Mat(), CV_PCA_DATA_AS_ROW, 3);
    
    std::cout << pca.mean << std::endl;
    std::cout << pca.eigenvalues << std::endl;
    std::cout << pca.eigenvectors << std::endl;
 
    return pca;
}

给我以下结果:

computing PCA with 162337 elements
[nan, 3.3579757, nan]
[nan;
 nan;
 nan]
[nan, nan, nan;
 nan, nan, nan;
 0, 0, 1]

任何帮助将不胜感激!

【问题讨论】:

  • 使用正确的垫子类型 CV_64FC1:Mat data = Mat(int (coords.size()), 3, CV_64FC1);
  • 谢谢,我知道有更有意义的价值观。我没有经常使用openCV:为什么要CV_64FC1?据我了解,CV代表openCV,64代表64位,F代表浮点,但不知道C1。
  • C1 = 1 个通道。由于您使用 .at 访问垫子,因此您需要 64FC1。如果你的类型是 32FC1 那么你需要 .at

标签: c++ opencv pca itk


【解决方案1】:

要计算变异的主成分,您需要有一些变异。你的情况有什么不同?

从单个肿瘤图像中,您可以计算主轴和其他一些可通过ShapeLabelObject 获得的统计数据。

请参阅Examplefilter docs

【讨论】:

  • 我使用肿瘤的坐标作为变量。这样我可以得到一个对应于椭球近似的最大轴的轴。
  • 那么你想要GetPrincipalAxes()中的第一个向量来自ShapeLabelObject类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
相关资源
最近更新 更多