1 #include "itkImage.h" 2 #include "itkImageFileReader.h" 3 #include "itkImageFileWriter.h" 4 //非线性映射滤波器头文件 5 #include "itkSigmoidImageFilter.h" 6 7 int main( int argc, char * argv[] ) 8 { 9 /*if( argc < 7 ) 10 { 11 std::cerr << "Usage: " << std::endl; 12 std::cerr << argv[0] << " inputImageFile outputImageFile"; 13 std::cerr << " OutputMin OutputMax SigmoidAlpha SigmoidBeta" << std::endl; 14 return EXIT_FAILURE; 15 }*/ 16 //然后必须定义这个滤波器的输入、输出像素和图像类型 17 typedef unsigned char InputPixelType; 18 typedef unsigned char OutputPixelType; 19 20 typedef itk::Image< InputPixelType, 2 > InputImageType; 21 typedef itk::Image< OutputPixelType, 2 > OutputImageType; 22 23 typedef itk::ImageFileReader< InputImageType > ReaderType; 24 typedef itk::ImageFileWriter< OutputImageType > WriterType; 25 26 ReaderType::Pointer reader = ReaderType::New(); 27 WriterType::Pointer writer = WriterType::New(); 28 //输入图像 29 reader->SetFileName( "BrainProtonDensitySlice.png" ); 30 //输出图像 31 writer->SetFileName( "Sigmoid_out.png" ); 32 //我们使用图像类型来实例化滤波器类型并创建滤波器对象 33 typedef itk::SigmoidImageFilter< 34 InputImageType, OutputImageType > SigmoidFilterType; 35 SigmoidFilterType::Pointer sigmoidFilter = SigmoidFilterType::New(); 36 //输出像素中的最小值和最大值分别使用 SetOutputMinimum( ) 和 SetOutputMaximum( ) 方式来定义 37 const OutputPixelType outputMinimum = atoi( "10" ); 38 const OutputPixelType outputMaximum = atoi( "240" ); 39 40 sigmoidFilter->SetOutputMinimum( outputMinimum ); 41 sigmoidFilter->SetOutputMaximum( outputMaximum ); 42 43 const double alpha = atof( "10" ); 44 const double beta = atof( "170" ); 45 /*使用 SetAlpha() 和 SetBeta() 来设置系数 α 和 β 。注意 α 是和输入亮度窗口成比例的。按 46 照惯例我们可以说这个窗口是间距[-3α , 3α] 。亮度窗口的边界并不明显。如图所示, α 47 平稳地接近它的极值。当你想通过在围绕人口均值周围定义一个间距[-3σ , 3σ] 来设置一个 48 人口测量的范围时,你可以以同样的形式来进行考虑*/ 49 sigmoidFilter->SetAlpha( alpha ); 50 sigmoidFilter->SetBeta( beta ); 51 /*可以从其他滤波器得到 SigmoidImageFilter 的输入,例如一个图像文件 reader 。输出可 52 以像一个图像文件 writer 一样传递给其他滤波器流水线。任何下游的滤波器调用 update 都可 53 以触发 Sigmoids 滤波器的运行*/ 54 55 sigmoidFilter->SetInput( reader->GetOutput() ); 56 writer->SetInput( sigmoidFilter->GetOutput() ); 57 writer->Update(); 58 59 return EXIT_SUCCESS; 60 }
脑部组织结构图像进行分割时可参考的参数:
白质部分:取 最小值 =10、 最大值 =240、α = 10、β = 170
脑室部分:取 最小值 =0、 最大值 =255、α = 6.67(20/3)、β = 230
灰质部分:取 最小值 =0、 最大值 =255、α = 5(15/3)、β =195
输入图像
白质Sigmoid输出图像
脑室Sigmoid输出图像
灰质Sigmoid输出图像
从图片中我们可以看到,白质部分的亮度扩展到它们的动态范围(【β - 3α,β+3α 】),而亮度值在 β - 3α 之下和在 β+3α 之上的值分别映射到输出值的最小值和最大值(即白质部分在在本例中像素范围为【140,200】)。这是一个 Sigmoids 用来执行平滑亮度窗口时使用的方式。
注意: α 和 β 都是可正可负的。一个负的 α 将对图像有相反的效果。这可以在上图中左边的图像中看到。在现实中 Sigmoids 曲线是很常见的。它们表达了图对一个刺激的灵敏性。它们也是高斯积分曲线,因此自然地可以作为高斯分布信号的一个响应。
注:非线性映射算法只能实现像素值(0-255)范围的映射。