【发布时间】: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