ITK直方图过滤器配置错误:无法正确统计非0图像值出现次数
问题描述
我有一个类型为using ITKImage = itk::Image<short, 3>;的ITK图像,已知其像素值仅为0、1、2。我希望统计除0外每个值的出现次数,于是使用直方图过滤器实现,代码如下:
////////////////////////////////// // Code to produce variable image of type ITKImage... ////////////////////////////////// using HistogramFilterType = itk::Statistics::ImageToHistogramFilter<ITKImage>; auto histogramFilter = HistogramFilterType::New(); using SizeType = HistogramFilterType::HistogramSizeType; SizeType size(1); size[0] = 2; HistogramFilterType::HistogramMeasurementVectorType lowerBound(1); lowerBound[0] = 1; HistogramFilterType::HistogramMeasurementVectorType upperBound(1); upperBound[0] = 2; histogramFilter->SetHistogramBinMinimum(lowerBound); histogramFilter->SetHistogramBinMaximum(upperBound); histogramFilter->SetHistogramSize(size); histogramFilter->SetInput(objectFilter->GetOutput()); histogramFilter->Update(); const unsigned int histogramSize = histogramFilter->GetOutput()->Size(); for (unsigned int bin = 0; bin < histogramSize; ++bin) { std::cout << histogramFilter->GetOutput()->GetFrequency(bin) << "\n"; }
但结果异常:GetFrequency(1)正确返回值2的出现次数,GetFrequency(0)却返回值0和1的总出现次数,请问过滤器配置哪里出错了?
问题原因与解决方法
问题根源
itk::Statistics::ImageToHistogramFilter默认不会忽略超出你设定的上下界的像素:
- 所有低于
lowerBound的像素会被归入第一个统计bin - 所有高于
upperBound的像素会被归入最后一个统计bin
你设置的lowerBound=1,因此图像中值为0的像素会被自动归入第一个bin,和值为1的像素叠加,导致GetFrequency(0)返回0和1的总次数。
解决方法
在过滤器配置代码中添加一行,启用忽略超出范围像素的选项:
histogramFilter->SetIgnoreOutOfRangePixels(true);
添加后,过滤器会只统计[1,2]范围内的像素,0值像素会被直接忽略。此时:
GetFrequency(0)将返回值1的出现次数GetFrequency(1)将返回值2的出现次数
完全符合你的统计需求。
内容的提问来源于stack exchange,提问作者5xum
相关产品推荐
相关产品推荐

