using UintPixelType = unsigned int;
using Uint3DImageType = itk::Image< UintPixelType, 3 >;
//只保留像素个数介于最大最小区间的连通域
typedef itk::ConnectedComponentImageFilter<Uchar3DImageType, Uint3DImageType> ConnectedComponentFilterType;
ConnectedComponentFilterType::Pointer connectedFilter = ConnectedComponentFilterType::New();
connectedFilter->SetInput(thrImg);
connectedFilter->Update();
//对连通区域算子得到的组分label id可能是不连续的,甚至是不不按顺序的,需要用RelabelComponentImageFilter 对label重新从1开始编号
typedef itk::RelabelComponentImageFilter<Uint3DImageType, Uint3DImageType> RelabelFilterType;
RelabelFilterType::Pointer relabelFilter = RelabelFilterType::New();
relabelFilter->SetInput(connectedFilter->GetOutput());
relabelFilter->SetMinimumObjectSize(1600); //最小值
relabelFilter->Update();
//去除联通域中像素点个数大于某一值的联通域,减少一些无关组织
Uint3DImageType::Pointer RelabelImg = relabelFilter->GetOutput();
int nLabelSize = relabelFilter->GetNumberOfObjects();
int nKeepIndex = -1;
for (int i = 0 ; i < nLabelSize; i++)
{
int nPixSize = relabelFilter->GetSizeOfObjectsInPixels()[i];
std::cout << nPixSize << std::endl;
if (nPixSize < 2500)//最大值
{
nKeepIndex = i+1;
break;
}
}
for (int k = 0; k < size[2]; k++) //层
{
for (int j = 0; j < size[1]; j++) //列
{
for (int i = 0; i < size[0]; i++) //行
{
Uchar3DImageType::IndexType pixelIndex; //列、行、层
pixelIndex[0] = j;
pixelIndex[1] = i;
pixelIndex[2] = k;
if (RelabelImg->GetPixel(pixelIndex) < nKeepIndex || nKeepIndex == -1)
{
RelabelImg->SetPixel(pixelIndex,0); //像素个数大于阈值的索引处置0
}
}
}
}
以上代码保留[1600 2500]的联通域