加载256张512*512横截面的CT图像,并将它们放在一个向量中
// 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;
}
在这里输入图片描述为什么两种初始化方式会导致不同的结果
在第一次尝试中,您使用以下命令创建输出数组:
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()
。请参阅此问答。