为什么我无法使用 C++ 代码从 256 张 CT 图像矢量正确生成冠状和矢状切片?

问题描述 投票:0回答:1

加载256张512*512横截面的CT图像,并将它们放在一个向量中(256),然后我想要得到冠状切面和矢状切面

// Get coronal section slice  
std::vector<cv::Mat> get_coronal() {  
    std::vector<cv::Mat> coronal_section(slice_height, cv::Mat(slice_num, slice_width, CV_16UC1, cv::Scalar(0)));  
    for (int i = 0; i < slice_height; i++)  
    {  
        for (int k = 0; k < slice_num; k++)  
        {  
            pixel_array[k].row(i).copyTo(coronal_section[i].row(k));  
        }  
    }  
    return coronal_section;  
}  
  
// Get sagittal section slice  
std::vector<cv::Mat> get_sagittal() {  
    std::vector<cv::Mat> sagittal_section(slice_width, cv::Mat(slice_height, slice_num, CV_16UC1, cv::Scalar(0)));  
    for (int j = 0; j < slice_width; j++)  
    {  
        for (int k = 0; k < slice_num; k++)  
        {  
            pixel_array[k].col(j).copyTo(sagittal_section[j].col(k));  
        }  
    }  
    return sagittal_section;  
}
 //get transverse section slice
 std::vector<cv::Mat> get_transverse()
 {
     return pixel_array;
 }


我用imshow显示了横截面、冠状面和矢状面,但冠状面和矢状面无法正常显示。我尝试将它们的向量数据类型调整为(CV_8UC1),但结果更糟。这就是结果

更改这两个功能后,图像显示正确。 但我不知道为什么第一个不起作用。

std::vector<cv::Mat> get_coronal() {
    std::vector<cv::Mat> coronal_section(slice_width);
    for (int i = 0; i < slice_width; i++) {
        cv::Mat slice(slice_num, slice_height, CV_16UC1);
        for (int j = 0; j < slice_num; j++) {
            pixel_array[j].row(i).copyTo(slice.row(j));
        }
        coronal_section[i] = slice;
    }
    return coronal_section;
}

std::vector<cv::Mat> get_sagittal() {
    std::vector<cv::Mat> sagittal_section(slice_height);
    for (int i = 0; i < slice_height; i++) {
        cv::Mat slice(slice_width,slice_num , CV_16UC1);
        for (int j = 0; j < slice_num; j++) {
            pixel_array[j].col(i).copyTo(slice.col(j));
        }
        sagittal_section[i] = slice;
    }
    return sagittal_section;
}

在这里输入图片描述为什么两种初始化方式会导致不同的结果

c++ opencv image-processing vector
1个回答
0
投票

在第一次尝试中,您使用以下命令创建输出数组:

std::vector<cv::Mat> sagittal_section(slice_width, cv::Mat(slice_height, slice_num, CV_16UC1, cv::Scalar(0)));  

此代码创建一个

cv::Mat
对象,然后用该对象的副本填充向量。但这些副本都共享它们的像素数据。这些副本中的每一个都是相同的图像。如果更改其中一个像素值,则会更改所有像素值。

因此,当您在循环中写入

sagittal_section[j].col(k)
,只有最后一个
j
迭代是明显的,所有早期的迭代都写入同一列,他们的工作被覆盖。

第二次尝试是正确的方法,为每个输出向量元素创建一个新图像。

在 OpenCV 中,当您想要创建可以独立修改的图像副本时,您不能这样做

im2 = im1
,因为两者将共享其像素数据。相反,请执行
im2 = im1.clone()
。请参阅此问答

© www.soinside.com 2019 - 2024. All rights reserved.