itk中的花式数据切割(二)

来源:互联网 发布:js namespace用法 编辑:程序博客网 时间:2024/05/29 19:18
上篇切割的特征是越切越小,这次换个不会变小的方法,当然不同的方法有利有弊,中间取舍,看实际情况。
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);}}}}}

对比上篇《一》的方法,思路刚好是相反的,《一》中是在原始数据的基础上,把不需要的删除,而这篇是从原始数据中把需要的提取出来。还是那句话,方法没有优劣,选择要看实际情况。


道生一,一生二,二生三,三生万物。
人法地,地法天,天法道,道法自然。

代码之余,时刻要提醒自己跳出程序之外,不要太忙,不要把编码时间安排的太满,走一走,停一停,回头看一看,想一想。代码撸的再好,始终只是用来糊口的术,用到什么,就去学什么好了,随时拿起,随时放下。真正需要思考的,是怎么才能过好这一生,这才是道。

原创粉丝点击