admin 发表于 2021-4-14 10:05:53

VTK图像类型转换

5.3.3 图像类型转换1.vtkImageCast图像数据类型转换在数字图像处理中会频繁用到。一些常用的图像算子(例如梯度算子)在计算时出于精度的考虑,会将结果存储为float 或double 类型,但在图像显示时,一般要求图像为unsigned char 类型,这时就需要对数据类型进行转换。VTK 中最简单的类型转换Filter就是vtkImageCast,其使用方法如下:

[*]vtkSmartPointer<vtkImageCast> imageCast =
[*]vtkSmartPointer<vtkImageCast>::New();
[*]imageCast->SetInput((vtkDataObject *)reader->GetOutput());
[*]imageCast->SetOutputScalarTypeToFloat();
[*]imageCast->Update();
只需要把SetOutputScalarTypeTo×××()设置成相应的输出类型即可。另外,该类中还有一个变量ClampOverflow,用来标识是否需要截断数据。默认情况下,该变量值为0。当设置其值为1 时,输出的像素值不能超过输出类型的***值,超过时自动截断至***值。该类在进行类型转换时,只是将数据进行强制转换,而没有进行比例的缩放,因此使用比较受限制,VTK 中也不推荐使用该类。例如一幅double 类型的图像,其数值范围为[-1, 1],如果需要将图像转换为unsigned char 类,则无法使用该Filter 进行转换。这时就需要用到vtkImageShiftScale。2.vtkImageShiftScalevtkImageShiftScale 可以指定偏移和比例参数来对输入图像数据进行操作,例如一幅double 类型的图像,其数值范围为[-1, 1],如果将其转换为unsigned char 类型,需要设置shift值为+1,比例系数设置为127.5,那么输入数据-1 映射为(-1+1)×127.5=0,而+1 则会映射为(+1+1)×127.5=255。对应代码如下:

[*]vtkSmartPointer<vtkImageShiftScale> shiftScaleFilter =
[*]vtkSmartPointer<vtkImageShiftScale>::New();
[*]shiftScaleFilter->SetInputConnection(image->GetProducerPort());
[*]shiftScaleFilter->SetOutputScalarTypeToUnsignedChar();
[*]shiftScaleFilter->SetShift(1);
[*]shiftScaleFilter->SetScale(127.5);
[*]shiftScaleFilter->Update();
vtkImageShiftScale::SetShift()用于设置偏移量Shift,vtkImageShiftScale::SetScale()用于设置放缩值Scale , 如果源图像的像素值为Val , 那么输出值为(Val+shift) × Scale 。SetOutputScalarTypeToUnsignedChar()用于设置输出类型为unsigned char,当然,该类也提供了其他输出类型的设置函数。另外需要注意的是,该类中也有一个变量ClampOverflow,当其值为1 时,如果输出值超过输出类型的***值时,则自动截断。例如,输出类型为unsigned char,数值范围为0~255,当输出像素值为257 时,该类会自动截断取值为255。默认情况下,变量ClampOverflow 的值为0,此时,当输出值为257,输出类型为unsigned char 时,该类不会将其截断,而是会产生溢出,***取值为2。
页: [1]
查看完整版本: VTK图像类型转换