线性映射
outputPixel = static cast<OutputPixelType>( inputPixel )
RescaleIntensityImageFilter 以一种将输入的最大值、最小值映射到用户提供的最大值、最小值的方式来线性地度量像素值。这是强制将图像的动态范围转换为适合于图像显示常见的一个特定范围内的一个普遍过程。这个滤波器应用的变换可以表达为:
![](https://img-blog.csdnimg.cn/b40b547be46446bf958487e8d4526903.png)
ShiftScaleImageFilter 同样应用一个输入图像亮度的线性变换,不过这个变换是由用户以增加一个值并乘一个乘数因子的形式来指定的。可以表达为:
![](https://img-blog.csdnimg.cn/fc0496aa2fd1474ea09164fad8cb740c.png)
由 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( );
非线性映射
在上面的方程中,I 是输入像素的亮度,I′是输出像素的亮度,Min、Max 是输出图像的最小值和最大值,α 定义了输入亮度范围的宽度,β 定义了围绕在范围中心的亮度。如图 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 );
![](https://img-blog.csdnimg.cn/31b9331142224c38aefd638609213bd8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSs56m7,size_20,color_FFFFFF,t_70,g_se,x_16)
使用 SetAlpha( )和 SetBeta( )来设置系数 α 和 β。注意 α 是和输入亮度窗口成比例的。按照惯例我们可以说这个窗口是间距[-3α,3α]。亮度窗口的边界并不明显。如图 6-6 所示,α 平稳地接近它的极值。当你想通过在围绕人口均值周围定义一个间距[-3σ,3σ]来设置一个人口测量的范围时,你可以同样的形式来进行考虑。
sigmoidFilter->SetAlpha( alpha );
sigmoidFilter->SetBeta( beta );
sigmoidFilter->SetInput( reader->GetOutput( ) );
writer->SetInput( sigmoidFilter->GetOutput( ) );
writer->Update( );
![](https://img-blog.csdnimg.cn/05f272367f0e44f5b4f4b550c7de088b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSs56m7,size_20,color_FFFFFF,t_70,g_se,x_16)