VTK ITK 支持的图像格式与像素数据 转换 二值化 与图像类型转换

13 篇文章 3 订阅

目录

 VTK ITK 支持的图像格式与像素数据 转换 二值化,有时需要相互转换;

VTK 图像类型转换

1.vtkImageCast

2.vtkImageShiftScale

 

 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();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值