ITK图像处理
闭运算
using ImageType = itk::Image<short, 3>;
gLogInfo << "start closing filter" << std::endl;
typedef itk::BinaryBallStructuringElement<ImageType::PixelType, 3> StructuringElementType;
StructuringElementType structuringElement;
structuringElement.SetRadius(5);
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;
连通域筛选
gLogInfo << "start component filter" << std::endl;
typedef itk::ConnectedComponentImageFilter<ImageType, ImageType> ConnectedComponentFilterType;
ConnectedComponentFilterType::Pointer connectedComponentFilter = ConnectedComponentFilterType::New();
connectedComponentFilter->SetInput(outputImg);
connectedComponentFilter->Update();
const unsigned int volumeThreshold = 20;
using LabelImageType = ConnectedComponentFilterType::OutputImageType;
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)
{
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;
}