ITK系列11_ PNG图像进行二维非线性映射

非线性映射

接下来的滤波器可以被看成是投射滤波器的一个变量。它的主要特性是使用一个平滑、连续的非线性形式的变换函数

itk::SigmoidImageFilter 通常作为一个亮度变换使用。它通过在亮度值的一个特定范围的边界的一个非常平滑连续的转变将这个范围映射到一个新的亮度范围,是广泛使用 Sigmoids来作为关注值的一个设置并逐渐削弱范围之外的值的一个机制。为了扩展 Sigmoids 滤波器的机动性,使用四个参数通过选择它的输入输出亮度范围来调节它在 ITK 中的执行。接下来的方程表达了 Sigmoids 亮度变换:

                                                              

在上面的方程中, I 是输入像素的亮度I′ 是输出像素的亮度Min 、 Max 是输出图像的最小值和最大值α 定义了输入亮度范围的宽度(可以理解为定义了函数形状)β 定义了围绕在范围中心的亮度(可以理解为定义了函数具体位置)。如图 所示阐述了每个参数的意义。1

               

                   SigmoidImageFilter 使用不同参数的效果(参数 α 定义了窗口像素的宽度;参数 β 定义了窗口像素的亮度)

 

实例11 PNG图像进行二维非线性映射

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
//非线性映射滤波器头文件
#include "itkSigmoidImageFilter.h"

int main( int argc, char * argv[] )
{
  /*if( argc < 7 )
    {
    std::cerr << "Usage: " << std::endl;
    std::cerr << argv[0] << "  inputImageFile   outputImageFile";
    std::cerr << " OutputMin OutputMax SigmoidAlpha SigmoidBeta" << std::endl;
    return EXIT_FAILURE;
    }*/
//然后必须定义这个滤波器的输入、输出像素和图像类型
  typedef   unsigned char  InputPixelType;
  typedef   unsigned char  OutputPixelType;

  typedef itk::Image< InputPixelType,  2 >   InputImageType;
  typedef itk::Image< OutputPixelType, 2 >   OutputImageType;
  
  typedef itk::ImageFileReader< InputImageType  >  ReaderType;
  typedef itk::ImageFileWriter< OutputImageType >  WriterType;

  ReaderType::Pointer reader = ReaderType::New();
  WriterType::Pointer writer = WriterType::New();
  //输入图像
  reader->SetFileName( "BrainProtonDensitySlice.png" );
  //输出图像
  writer->SetFileName( "Sigmoid_out.png" );
  //我们使用图像类型来实例化滤波器类型并创建滤波器对象
  typedef itk::SigmoidImageFilter<
               InputImageType, OutputImageType >  SigmoidFilterType;
  SigmoidFilterType::Pointer sigmoidFilter = SigmoidFilterType::New();
  //输出像素中的最小值和最大值分别使用 SetOutputMinimum( ) 和 SetOutputMaximum( ) 方式来定义
  const OutputPixelType outputMinimum = atoi( "10" );
  const OutputPixelType outputMaximum = atoi( "240" );

  sigmoidFilter->SetOutputMinimum(   outputMinimum  );
  sigmoidFilter->SetOutputMaximum(   outputMaximum  );
  
  const double  alpha = atof( "10" );
  const double  beta  = atof( "170" );
  /*使用 SetAlpha() 和 SetBeta() 来设置系数 α 和 β 。注意 α 是和输入亮度窗口成比例的。按
      照惯例我们可以说这个窗口是间距[-3α , 3α] 。亮度窗口的边界并不明显。如图所示, α
      平稳地接近它的极值。当你想通过在围绕人口均值周围定义一个间距[-3σ , 3σ] 来设置一个
      人口测量的范围时,你可以以同样的形式来进行考虑*/
  sigmoidFilter->SetAlpha(  alpha  );
  sigmoidFilter->SetBeta(   beta   );
  /*可以从其他滤波器得到 SigmoidImageFilter 的输入,例如一个图像文件 reader 。输出可
      以像一个图像文件 writer 一样传递给其他滤波器流水线。任何下游的滤波器调用 update 都可
      以触发 Sigmoids 滤波器的运行*/

  sigmoidFilter->SetInput( reader->GetOutput() );
  writer->SetInput( sigmoidFilter->GetOutput() );
  writer->Update();
  
  return EXIT_SUCCESS;
}

脑部组织结构图像进行分割时可参考的参数:

                                         

白质部分:取 最小值 =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)范围的映射

 

ITK系列目录:

1 ITK图像数据表达之图像

2 ITK图像处理之图像滤波

3 ITK图像处理之图像分割

注:例程配套素材见系列目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦我飞也

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值