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

上篇切割的特征是越切越小,这次换个不会变小的方法,当然不同的方法有利有弊,中间取舍,看实际情况。
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);
				}
			}			
		}
	}
}

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


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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值