上篇切割的特征是越切越小,这次换个不会变小的方法,当然不同的方法有利有弊,中间取舍,看实际情况。
0.先构建一个与原始数据同等大小的图像,这个是前提条件
略。。。(不清楚的请转《itk中的基本图像操作》一文)
1.沿着Z轴按照预设范围切出方盒子(其实随便XYZ那一边都一样)
ImageType::SizeType size = input_data->GetLargestPossibleRegion().GetSize();
int min_temp = point_z[2] - min;
int max_temp = point_z[2] + max;
for(int k= min_temp; k<max_temp; k++)
{
for(int j=0; j<size[1]; j++)
{
for(int i=0; i<size[0]; i++)
{
ImageType::IndexType point_temp;
point_temp[0] = i;
point_temp[1] = j;
point_temp[2] = k;
ImageType::PixelType value = input_data->GetPixel(point_temp);
output_data->SetPixel(point_temp,1);
}
}
}
思路:构建同等大小的容器,然后将需要的像素点放进去。
优点:结果图像和原始图像一样大小,可以直接做数学运算
缺点:由于像素点相等,所以在遍历时候运算速度受到一定影响
2.切出序列图像的某一层
ImageType::RegionType inputRegion = input_data->GetLargestPossibleRegion();
ImageType::SizeType size = inputRegion.GetSize();
if (factor_mode == X)
{
int x = num_temp;
for (int y=0;y<size[1];y++)
{
for (int z=0;z<size[2];z++)
{
ImageType::IndexType point_temp;
point_temp[0] = x;
point_temp[1] = y;
point_temp[2] = z;
ImageType::PixelType rad_value = input_data->GetPixel(point_temp);
output_data->SetPixel(point_temp,rad_value);
}
}
}
else if (factor_mode == Y)
{
int y = num_temp;
for (int x=0;x<size[0];x++)
{
for (int z=0;z<size[2];z++)
{
ImageType::IndexType point_temp;
point_temp[0] = x;
point_temp[1] = y;
point_temp[2] = z;
ImageType::PixelType rad_value = input_data->GetPixel(point_temp);
output_data->SetPixel(point_temp,rad_value);
}
}
}
else if(factor_mode == Z)
{
int z = num_temp;
for (int x=0;x<size[0];x++)
{
for (int y=0;y<size[1];y++)
{
ImageType::IndexType point_temp;
point_temp[0] = x;
point_temp[1] = y;
point_temp[2] = z;
ImageType::PixelType rad_value = input_data->GetPixel(point_temp);
output_data->SetPixel(point_temp,rad_value);
}
}
}
思路:和1中的方法如出一辙。只是提取了某一层。其实按照这方法,你可以把任何想提取的像素点放到对应的容器中。比如接下来的3。
3.切出一个球形(其实随便什么形状)
ImageType::RegionType inputRegion = input_data->GetLargestPossibleRegion();
ImageType::SizeType size = inputRegion.GetSize();
int radius2=radius*radius;
for(int k=0;k<size[2];k++)
{
for(int j=0;j<size[1];j++)
{
for(int i=0;i<size[0];i++)
{
if((i-x)*(i-x)+(j-y)*(j-y)+(k-z)*(k-z)<=radius2)
{
ImageType::IndexType point_temp2;
point_temp2[0] = i;
point_temp2[1] = j;
point_temp2[2] = k;
output_data->SetPixel(point_temp2,density);
}
}
}
}
}
对比上篇《一》的方法,思路刚好是相反的,《一》中是在原始数据的基础上,把不需要的删除,而这篇是从原始数据中把需要的提取出来。还是那句话,方法没有优劣,选择要看实际情况。
人法地,地法天,天法道,道法自然。
代码之余,时刻要提醒自己跳出程序之外,不要太忙,不要把编码时间安排的太满,走一走,停一停,回头看一看,想一想。代码撸的再好,始终只是用来糊口的术,用到什么,就去学什么好了,随时拿起,随时放下。真正需要思考的,是怎么才能过好这一生,这才是道。