ITK 投射和亮度映射

        本节介绍的滤波器实现 pixel-wise 亮度映射。投射用来将一种像素类型转换成另一种, 而亮度映射也用来计算不同像素类型的亮度范围。

线性映射

        本小节的源代码在文件 Examples/Filtering/CastingImageFilters.cxx 中。由于在研发平台中使用范型编程,所以大多数类型都由编译时间决定,很少有关于类型变换的决定留到运行时间解决的。由用户将像素类型转换为数据流水线所需要的像素类型。在医学图像应用中,通常不会使用一种通用的像素类型,因为这样将导致有价值信息的流失。
        本小节介绍流经流水线的图像的外在投射的机制。下面将处理接下来的四个滤波器:itk::CastImageFilter 、 itk::RescaleIntensityImageFilter itk::ShiftScaleImageFilter 和 itk::NormalizeImageFilter。这些滤波器除了它们都可以修改像素值之外,互相之间并不直接相关。这里将它们放在一起是为了比较它们之间各自的特征。
         CastImageFilter 是一个非常简单的滤波器,它对输入图像进行 pixel-wise 将每个像素投射到输出图像类型注意这个滤波器并不对亮度执行任何算法操作。应用 CastImageFilter 等价于对每个像素执行一个 C 类型的投射。
outputPixel = static cast<OutputPixelType>( inputPixel )

        RescaleIntensityImageFilter 以一种将输入的最大值、最小值映射到用户提供的最大值、最小值的方式来线性地度量像素值。这是强制将图像的动态范围转换为适合于图像显示常见的一个特定范围内的一个普遍过程。这个滤波器应用的变换可以表达为:

          ShiftScaleImageFilter 同样应用一个输入图像亮度的线性变换,不过这个变换是由用户以增加一个值并乘一个乘数因子的形式来指定的。可以表达为:

          由 NormalizeImageFilter 应用的线性变换的参数是在中心计算的因此输出图像灰度级的统计分布的均值为 0,方差为 1。这个亮度修正在作为相互信息度量的估计的一个预处理步骤的注册应用中特别有用。NormalizeImageFilter 的线性变换可以表达为:

//和通常一样,使用这些滤波器的第一步需要包含它们的头文件:
#include "itkCastImageFilter.h" 
#include "itkRescaleIntensityImageFilter.h"
#include "itkShiftScaleImageFilter.h"
#include "itkNormalizeImageFilter.h"

//我们定义输入和输出图像的像素类型:
typedef unsigned char InputPixelType;
typedef float OutputPixelType;

//然后,定义输入和输出图像类型:
typedef itk::Image< InputPixelType, 3 > InputImageType;
typedef itk::Image< OutputPixelType, 3 > OutputImageType;

//使用定义的图像类型来对滤波器进行实例化:
typedef itk::CastImageFilter<
InputImageType, OutputImageType > CastFilterType;//确定输出图像类型
typedef itk::RescaleIntensityImageFilter<
InputImageType, OutputImageType > RescaleFilterType;
typedef itk::ShiftScaleImageFilter<
InputImageType, OutputImageType > ShiftScaleFilterType;//默认均值为0,方差为1
typedef itk::NormalizeImageFilter<
InputImageType, OutputImageType > NormalizeFilterType;

//通过调用 New( )操作来创建对象滤波器并将结果指向 itk::SmartPointers:
CastFilterType::Pointer castFilter = CastFilterType::New( );
RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New( );
ShiftScaleFilterType::Pointer shiftFilter = ShiftScaleFilterType::New( );
NormalizeFilterType::Pointer normalizeFilter = NormalizeFilterType::New( );

//现在将一个 reader 滤波器(这里并未展示它的创建)的输出作为输入连接到投射滤波器:
castFilter->SetInput( reader->GetOutput( ) );
shiftFilter->SetInput( reader->GetOutput( ) );
rescaleFilter->SetInput( reader->GetOutput( ) );
normalizeFilter->SetInput( reader->GetOutput( ) );

//接下来我们设置每个滤波器需要的参数。CastImageFilter 和 NormalizeImageFilter 不需要任何参数。另一方面,RescaleIntensityImageFilter 需要用户提供想得到的输出图像像素值的最大最小值,这可以通过使用 SetOutputMinimum( )和 SetOutputMaximum( )方式来实现,如下所示:
rescaleFilter->SetOutputMinimum( 10 );//输入最小值
rescaleFilter->SetOutputMaximum( 250 );//输入最大值
//ShiftScaleImageFilter 需要一个乘数因子(比例)(一个传递比例的附加值(移位)。可以分别使用 SetScale( )和 SetShift( )方式来设置这些值:
shiftFilter->SetScale( 1.2 );//乘数因子
shiftFilter->SetShift( 25 );//附加值

//最后,通过调用 Update( )方式来运行滤波器:
castFilter->Update( );
shiftFilter->Update( );
rescaleFilter->Update( );
normalizeFilter->Update( );

非线性映射

        接下来的滤波器可以被看成是投射滤波器的一个变量。它的主要特性是使用一个平滑、连续的非线性形式的变换函数
        本小节的源代码在文件 Examples/Filtering/SigmoidImageFilter.cxx 中。
         itk::SigmoidImageFilter 通常作为一个亮度变换使用。它通过在亮度值的一个特定范围的边界的一个非常平滑连续的转变将这个范围映射到一个新的亮度范围,是广泛使用 Sigmoids 来作为关注值的一个设置并逐渐削弱范围之外的值的一个机制。为了扩展 Sigmoids 滤波器的机动性,使用四个参数通过选择它的输入、输出亮度范围来调节它在 ITK 中的执行。接下来的方程表达了 Sigmoids 亮度变换:

        在上面的方程中,I 是输入像素的亮度,I′是输出像素的亮度,MinMax 是输出图像的最小值和最大值,α 定义了输入亮度范围的宽度,β 定义了围绕在范围中心的亮度。如图 6-6 所示阐述了每个参数的意义。

//这个滤波器可以对任何维的图像使用并在必要时可以使用多处理。
//首先必须包含与这个滤波器相关的头文件:
#include "itkSigmoidImageFilter.h"

//然后必须定义这个滤波器的输入、输出像素和图像类型:
typedef unsigned char InputPixelType;
typedef unsigned char OutputPixelType;
typedef itk::Image< InputPixelType, 2 > InputImageType;
typedef itk::Image< OutputPixelType, 2 > OutputImageType;

//我们使用图像类型来实例化滤波器类型并创建滤波器对象。
typedef itk::SigmoidImageFilter<InputImageType, OutputImageType > SigmoidFilterType;
SigmoidFilterType::Pointer sigmoidFilter = SigmoidFilterType::New( );

//输出中的最小值和最大值分别使用 SetOutputMinimum( )和 SetOutputMaximum( )方式来定义。
sigmoidFilter->SetOutputMinimum( outputMinimum );
sigmoidFilter->SetOutputMaximum( outputMaximum ); 
标题 图 6-6 SigmoidImageFilter 使用不同参数的效果。参数 α 定义了窗口的宽度;参数 β 定义了窗口的亮度

        使用 SetAlpha( )SetBeta( )来设置系数 α β。注意 α 是和输入亮度窗口成比例的。按照惯例我们可以说这个窗口是间距[-3α]。亮度窗口的边界并不明显。如图 6-6 所示,α 平稳地接近它的极值。当你想通过在围绕人口均值周围定义一个间距[-3σ]来设置一个人口测量的范围时,你可以同样的形式来进行考虑。

sigmoidFilter->SetAlpha( alpha );
sigmoidFilter->SetBeta( beta );
        可以从其他滤波器得到 SigmoidImageFilter 的输入,例如一个图像文件 reader 。输出可以像一个图像文件 writer 一样传递给其他滤波器流水线。任何下游的滤波器调用 update 都可以触发 Sigmoids 滤波器的运行。
sigmoidFilter->SetInput( reader->GetOutput( ) );
writer->SetInput( sigmoidFilter->GetOutput( ) );
writer->Update( );
        如图 6-7 所示阐述了这个滤波器使用下面参数对一个 MRI 脑部图像切片作用的效果:
 
        从图片中我们可以看到,白质部分的亮度扩展到它们的动态范围,而亮度值在 β -之下和在 β+3α 之上的值分别映射到输出值的最小值和最大值。这是一个 Sigmoids 用来执行平滑亮度窗口时使用的方式。
        注意:α β 都是可正可负的。一个负的 α 将对图像有相反的效果。
        在现实中 Sigmoids 曲线是很常见的。它们表达了图对一个刺激的灵敏性。它们也是高斯积分曲线,因此自然地可以作为高斯分布信号的一个响应。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值