You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:48:26