当图像像素值范围很大的时候,比如[-10000,234343],但是很有可能我们只需要[-99,103]之间的内容,其他地方是不需要的。这个时候就可以通过代码设置窗宽窗位。
头文件声明
/// <summary>
/// 设置窗宽窗位
/// </summary>
/// <param name="image_3d">输入itk图像</param>
/// <param name="winMin">窗的左值</param>
/// <param name="winMax">窗的右值</param>
/// <param name="outMinimum">调整窗宽窗位之后的像素最小值</param>
/// <param name="outMaximum">调整窗宽窗位之后的像素最大值</param>
void setWindow(ImageStyle3D& image_3d, const int winMin, const int winMax,
const int outMinimum, const int outMaximum);
实现
void Segmentation::setWindow(
ImageStyle3D& image_3d,
const int winMin, const int winMax,
const int outMinimum, const int outMaximum)
{
using IntensityWindowingImageFilterType =
itk::IntensityWindowingImageFilter<ImageType3D, ImageType3D>;
auto filter = IntensityWindowingImageFilterType::New();
filter->SetInput(image_3d);
filter->SetWindowMinimum(winMin);
filter->SetWindowMaximum(winMax);
filter->SetOutputMinimum(outMinimum);
filter->SetOutputMaximum(outMaximum);
try {
filter->Update();
}
catch (const itk::ExceptionObject& err) {
std::cout << "Segmentation::setWindows(), 在设置窗宽窗位时发生异常!" << std::endl;
std::cout << err.what() << std::endl;
throw "异常: 在设置窗宽窗位时发生异常!";
}
image_3d = filter->GetOutput();
}
使用示例
// 用户自定义参数,需要根据实际情况修改
int winMin = -2494, winMax = 2293;
int minimum = 0, maximum = 255;
// 调整窗宽窗宽
seger.setWindow(ctImageNii, winMin, winMax, minimum, maximum);