You need to enable JavaScript to run this app. C++环境下基于ITK计算肿瘤二值图像PCA及OpenCV实现异常咨询
优惠活动
大模型
产品
解决方案
定价
更多

C++环境下基于ITK计算肿瘤二值图像PCA及OpenCV实现异常咨询

问题修复方案

一、OpenCV 计算出现nan值的原因与修复

OpenCV代码存在致命的类型不匹配错误,直接导致数据读写错乱产生nan:

  • 定义矩阵时指定为32位浮点类型:Mat data = Mat(int (coords.size()), 3, CV_32F);
  • 赋值时使用64位double类型的读写接口:data.at<double>(int (i), 0) = ...
    内存读写的位宽不匹配会导致数据被错误解析,最终生成非法的nan值。

补充优化点:

  • 无需手动指定PCA主成分数量,3个特征对应3个主成分,传0即可获取全部结果
  • 统一矩阵类型与读写接口的位宽,避免类型混乱

修正后的OpenCV代码:

typedef itk::Point<double, 3> PointType;    
PCA computePCA(vector<PointType> coords) {
    qDebug() << "computing PCA with" << coords.size() << "elements";
    // 统一为64位double类型,与at<double>接口匹配
    Mat data = Mat(static_cast<int>(coords.size()), 3, CV_64F);

    for (size_t i = 0; i < coords.size(); ++i) {
        data.at<double>(static_cast<int>(i), 0) = coords.at(i)[0];
        data.at<double>(static_cast<int>(i), 1) = coords.at(i)[1];
        data.at<double>(static_cast<int>(i), 2) = coords.at(i)[2];
    }
    
    // 传0获取全部主成分,无需手动指定数量
    PCA pca(data, Mat(), CV_PCA_DATA_AS_ROW, 0);
    
    std::cout << pca.mean << std::endl;
    std::cout << pca.eigenvalues << std::endl;
    std::cout << pca.eigenvectors << std::endl;
 
    return pca;
}

二、ITK ImagePCADecompositionCalculator 使用误区

对该类的功能理解存在核心偏差:
ImagePCADecompositionCalculator的设计目标是对多幅已配准图像的像素强度值做PCA(用于构建强度统计模型),而非对二值图像的前景体素坐标做形状PCA(获取肿瘤的主轴方向、方差分布等),因此无法从该类中获取期望的坐标PCA结果。

如果需要使用ITK实现坐标PCA,可按以下步骤操作:

  • 遍历二值肿瘤图像,提取所有前景体素的物理坐标
  • 借助ITK统计模块(如itk::Statistics::ListSample存储坐标样本,itk::Statistics::CovarianceSampleCalculator计算协方差矩阵)
  • 对协方差矩阵做特征值分解,即可得到均值、特征值、特征向量

内容的提问来源于stack exchange,提问作者uro1012

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 22:06:02