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
相关产品推荐
相关产品推荐

