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.vtkImageShiftScale vtkImageShiftScale 可以指定偏移和比例参数来对输入图像数据进行操作,例如一幅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。
|