ITK进行形态学闭运算与连通域大小筛选

ITK图像处理

闭运算

	using ImageType = itk::Image<short, 3>;

	// closing filter
	gLogInfo << "start closing filter" << std::endl;
	typedef itk::BinaryBallStructuringElement<ImageType::PixelType, 3> StructuringElementType;
	StructuringElementType structuringElement;
	structuringElement.SetRadius(5); // radius

	typedef itk::BinaryMorphologicalClosingImageFilter<ImageType, ImageType, StructuringElementType> ClosingFilterType;
	ClosingFilterType::Pointer closingFilter = ClosingFilterType::New();
	closingFilter->SetInput(outputImg);
	closingFilter->SetKernel(structuringElement);
	closingFilter->Update();
	gLogInfo << "after closing filter" << std::endl;

连通域筛选

	// Component filter
	gLogInfo << "start component filter" << std::endl;
	typedef itk::ConnectedComponentImageFilter<ImageType, ImageType> ConnectedComponentFilterType;
	ConnectedComponentFilterType::Pointer connectedComponentFilter = ConnectedComponentFilterType::New();
	//connectedComponentFilter->SetInput(closingFilter->GetOutput());
	connectedComponentFilter->SetInput(outputImg);
	connectedComponentFilter->Update();
	
	const unsigned int volumeThreshold = 20;

	using LabelImageType = ConnectedComponentFilterType::OutputImageType;
	// get labelMap
	using LabelImageToLabelMapFilterType = itk::LabelImageToLabelMapFilter<LabelImageType>;
	LabelImageToLabelMapFilterType::Pointer labelImageToLabelMapFilter = LabelImageToLabelMapFilterType::New();
	labelImageToLabelMapFilter->SetInput(connectedComponentFilter->GetOutput());
	labelImageToLabelMapFilter->Update();

	using LabelMapType = LabelImageToLabelMapFilterType::OutputImageType;
	LabelMapType::Pointer labelMap = labelImageToLabelMapFilter->GetOutput();
	int cnt = labelMap->GetNumberOfLabelObjects();
	labelMap->SetBackgroundValue(0);
	using LabelObjectType = itk::ShapeLabelObject<short, 3>;
	std::vector<LabelObjectType::Pointer> filtered_label_objects;
	for (unsigned int i = 0; i < labelMap->GetNumberOfLabelObjects(); ++i)
	{
		
		LabelObjectType *labelObject = static_cast<LabelObjectType *>(labelMap->GetNthLabelObject(i));
		const double area = labelObject->GetNumberOfLines();
		if (area < volumeThreshold)
		{
			//std::cout << area << std::endl;
			filtered_label_objects.push_back(labelObject);
		}
	}

	for (int i = 0; i < filtered_label_objects.size(); i++)
	{
		labelMap->RemoveLabelObject(filtered_label_objects[i]);
	}
	
	using LabelMapToLabelImageFilterType = itk::LabelMapToLabelImageFilter<LabelMapType, ImageType>;
	LabelMapToLabelImageFilterType::Pointer labelMapToLabelImageFilter = LabelMapToLabelImageFilterType::New();
	labelMapToLabelImageFilter->SetInput(labelMap);
	labelMapToLabelImageFilter->Update();
	ImageType *outputImage = labelMapToLabelImageFilter->GetOutput();
	// 输出标签不是二值? 通过迭代器修改标签值
	itk::ImageRegionIterator<ImageType> outputIterator(outputImage, outputImage->GetLargestPossibleRegion());
	
	while (!outputIterator.IsAtEnd())
	{
		float value = (float)(outputIterator.Get());
		if (value != 0)
		{
			outputIterator.Set(1);
		}
		++outputIterator;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值