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

上篇切割的特征是越切越小,这次换个不会变小的方法,当然不同的方法有利有弊,中间取舍,看实际情况。
0.先构建一个与原始数据同等大小的图像,这个是前提条件

略。。。(不清楚的请转《itk中的基本图像操作》一文)

itk中的花式数据切割(二)_第1张图片

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; kGetPixel(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;yGetPixel(point_temp);
			output_data->SetPixel(point_temp,rad_value);
		}
	}
}
else if (factor_mode == Y)
{
	int y = num_temp;
	for (int x=0;xGetPixel(point_temp);
			output_data->SetPixel(point_temp,rad_value);
		}
	}
}
else if(factor_mode == Z)
{
	int z = num_temp;
	for (int x=0;xGetPixel(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;kSetPixel(point_temp2,density);
				}
			}			
		}
	}
}

对比上篇《一》的方法,思路刚好是相反的,《一》中是在原始数据的基础上,把不需要的删除,而这篇是从原始数据中把需要的提取出来。还是那句话,方法没有优劣,选择要看实际情况。
itk中的花式数据切割(二)_第2张图片


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

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

你可能感兴趣的:(ITK医学图像处理)