目录
VTK ITK 支持的图像格式与像素数据 转换 二值化,有时需要相互转换;
VTK ITK 支持的图像格式与像素数据 转换 二值化,有时需要相互转换;
有时需要设置像素值,可以使用vtkImageThreshold
作用:
1 SetOutputScalarTypeToUnsignedChar 下面方法 是转成 unsignedchar
2.像素值转换
下面是 像素值转成 1,0;
// Thresholding
vtkSmartPointer<vtkImageThreshold> imageThreshold = vtkSmartPointer<vtkImageThreshold>::New();
imageThreshold->SetInputConnection(indexCoordinatesImageFilter->GetOutputPort());
imageThreshold->SetOutputScalarTypeToUnsignedChar();
imageThreshold->ThresholdByLower(0.99); // range is inclusive but always in double. Precision issue.
imageThreshold->SetOutValue(1);
imageThreshold->SetInValue(0);
imageThreshold->ReleaseDataFlagOn();
imageThreshold->UpdateInformation();
imageThreshold->Update();
vtkImageThreshold类实现图像的阈值化处理,其功能不仅仅是生成二值图像。在本例中,我们以图像二值化操作为例来介绍该类。vtkImageThreshold类中定义了两个阈值,UpperThreshold和LowerThreshold,这两个值将图像的值域划分为三部分:大于UpperThreshold,小于LowerThreshold,以及位于LowerThreshold和UpperThreshold之间的三段。函数ThresholdByUpper()设置为取大于UpperThreshold的灰度范围为有效范围,并通过函数SetInValue()来设置该范围内的输出值,SetOutValue()设置范围外的输出值,本例中取大于100所有像素输出值为255,而小于100的像素值为0。该例的结果执行如下。
另外还有其他两种方式,ThresholdByLower()取小于LowerThreshold的范围为有效范围;ThresholdBetween()取LowerThreshold和UpperThreshold之间的部分为有效范围。另外SetInValue()和SetOutValue()如果不设置的话,图像会按原图输出。可以通过该类来实现图像数据范围的截断操作。
对于二值图像前景由多个对象组成,而每个对象是一个连通分量,对象之间不存在连通关系。在处理图像时,需要将不同的对象分别提取出来或者将不同对象赋一个label值,这样得到的图像成为label图像。目前VTK中没有提取二值图像连通分量的filter以及相应的对二值图像label化的filter。如果要实现该功能,可以考虑与ITK相结合。
VTK 图像类型转换
1.vtkImageCast
图像数据类型转换在图像处理中经常用到。 在计算时出于精度的考虑,会将结果存储为float或者double类型。但是在图像显示时,一般需要图像为unsigned char类型。
vtkSmartPointer<vtkImageCast> imgCast =
vtkSmartPointer<vtkImageCast>::New();
imgCast->SetInput( (vtkDataObject*)reader->GetOutput() );
imgCast->SetOutputScalarTypeToFloat();
imgCast->Update();
类型转换:
只需要把SetOutputScalarTypeToXXX()设置成相应的输出类型即可。
void SetOutputScalarTypeToDouble()
{this->SetOutputScalarType(VTK_DOUBLE);}
void SetOutputScalarTypeToFloat()
{this->SetOutputScalarType(VTK_FLOAT);}
void SetOutputScalarTypeToLong()
{this->SetOutputScalarType(VTK_LONG);}
void SetOutputScalarTypeToUnsignedLong()
{this->SetOutputScalarType(VTK_UNSIGNED_LONG);};
void SetOutputScalarTypeToInt()
{this->SetOutputScalarType(VTK_INT);}
void SetOutputScalarTypeToUnsignedInt()
{this->SetOutputScalarType(VTK_UNSIGNED_INT);}
void SetOutputScalarTypeToShort()
{this->SetOutputScalarType(VTK_SHORT);}
void SetOutputScalarTypeToUnsignedShort()
{this->SetOutputScalarType(VTK_UNSIGNED_SHORT);}
void SetOutputScalarTypeToChar()
{this->SetOutputScalarType(VTK_CHAR);}
void SetOutputScalarTypeToUnsignedChar()
{this->SetOutputScalarType(VTK_UNSIGNED_CHAR);}
需要注意的是,这个类中还有一个变量是ClampQverflow,用来标识是否组要截断数据。默认情况下,该变量值为0;当设置为1时,输出的像素值不能超过输出类型的最大值。超过时会自动截断到最大值。
此外还需要知道的就是,这个类进行类型转换时,只是将类型进行强制转换,而没有进行比例的缩放,因此使用起来会比较受限,因此VTK中时不推荐使用这个类的,例如一副double类型的图像,图像值的范围[-1,1]。如果需要将图像转化为unsigned char类型,这种方法是不可行的!
2.vtkImageShiftScale
这个类可以指定偏移和比例参数来对输入图像数据进行操作,例如一副double类型的图像,其数值范围为[-1,1],如果将其转换为unsigned char类型,需要设置shift=+1,Scale=127.5;那么输入图像的数据-1可以被映射为(-1+1)*127.5=0;+1可以被映射为(1+1)*127.5=255。
即: 0~255
vtkSmartPointer<vtkImageShiftScale> ShiftScale =
vtkSmartPointer<vtkImageShiftScale>::New();
ShiftScale->SetInputConnection(img->GetOProducerPort());
ShiftScale->SetOutputScalarTypeToUnsignedChar();
ShiftScale->SetShift(1);
ShiftScale->SetScale(127.5);
ShiftScale->Update();