05-VTK在图像处理中的应用(6)

5.10 图像运算

5.10.1 数学运算

vtkImageMathematics提供了基本的一元和二元数学操作。根据不同的操作,需要一个或者两个输入图像。二元数字操作要求两个输入图像具有相同的像素数据类型,颜色分量。当两个图像大小不同时,输出图像的范围为两个输入图像范围的并集,并且原点和像素间隔与第一个输入图像保持一致。

 

1:  vtkSmartPointer<vtkImageCanvasSource2D>imageSource =

  2:    vtkSmartPointer<vtkImageCanvasSource2D>::New();

  3:  imageSource->SetNumberOfScalarComponents(3);

  4:  imageSource->SetScalarTypeToUnsignedChar();

  5:   imageSource->SetExtent(0,4, 0, 4, 0, 0);

  6:  imageSource->SetDrawColor(100.0, 0, 0);

  7:   imageSource->FillBox(0, 4,0, 4);

  8:   imageSource->Update();

  9:  

 10:   vtkSmartPointer<vtkImageMathematics>imageMath =

 11:    vtkSmartPointer<vtkImageMathematics>::New();

 12:  imageMath->SetOperationToMultiplyByK();

 13:  imageMath->SetConstantK(2.0);

 14:  imageMath->SetInputConnection(imageSource->GetOutputPort());

 15:   imageMath->Update();

 

上例中生成了一副图像,图像中绘制了一个暗红色矩形;然后定义vtkImageMathematics对象,并调用SetOperationToMultiplyByK()函数来将图像中所有的像素值乘以一个常数K,这里常数值为2.0,下图为输出结果。

 

图5.23 图像数学运算

 

vtkImageMathematics中支持的二元数学操作有:

SetOperationToAdd:两个图像对应像素加法运算

SetOperationToSubtract:两个图像对应像素减法运算

SetOperationToMultiply:两个图像对应像素相乘运算

SetOperationToDivide:两个图像对应像素相除运算

SetOperationToConjugate:将两个标量图像对应像素组合为共轭复数

SetOperationToComplexMultiply:两个图像对应像素复数乘法运算

SetOperationToMin:取两个图像中对应像素较小值

SetOperationToMax:取两个图像中对应像素较大值

一元操作有:

SetOperationToInvert:图像像素值取倒数运算

SetOperationToSin:图像像素值正弦运算

SetOperationToCos:图像像素值余弦运算

SetOperationToExp:图像像素值自然指数运算

SetOperationToLog:图像像素值自然对数运算

SetOperationToAbsoluteValue:图像像素值取绝对值

SetOperationToSquare:图像像素值平方运算

SetOperationToSquareRoot:图像像素值平凡根运算

SetOperationToATAN:图像像素值正切运算

SetOperationToATAN2:图像像素值反正切运算

SetOperationToMultiplyByK:图像像素值乘以常数K,需要先调用SetConstantK()设置K值

SetOperationToAddConstant:图像像素值加上常数K,需要先调用SetConstantK()设置K值

SetOperationToReplaceCByK:将图像中像素为C的像素值替换为K,需要先调用SetConstantK()和SetConstantC设置K和C值

5.10.2 逻辑运算

vtkImageLogic接收一个或者两个图像进行布尔逻辑运算,该类主要支持与(AND),或(OR),异或(XOR),与非(NAND),或非(NOR)和非(NOT)。当选择一元操作符时,只对第一个输入图像有效。 当选择二元操作符时,两个输入图像的类型必须一致。下面看一个实例。

1:  vtkSmartPointer<vtkImageCanvasSource2D>imageSource1 =

  2:    vtkSmartPointer<vtkImageCanvasSource2D>::New();

  3:   imageSource1->SetScalarTypeToUnsignedChar();

  4:  imageSource1->SetNumberOfScalarComponents(1);

  5:   imageSource1->SetExtent(0,100, 0, 100, 0, 0);

  6:  imageSource1->SetDrawColor(0.0);

  7:  imageSource1->FillBox(0,100,0,100);

  8:   imageSource1->SetDrawColor(255);

  9:  imageSource1->FillBox(20,60,20,60);

 10:   imageSource1->Update();

 11:  

 12:  vtkSmartPointer<vtkImageCanvasSource2D> imageSource2 =

 13:    vtkSmartPointer<vtkImageCanvasSource2D>::New();

 14:   imageSource2->SetNumberOfScalarComponents(1);

 15:  imageSource2->SetScalarTypeToUnsignedChar();

 16:  imageSource2->SetExtent(0, 100, 0, 100, 0, 0);

 17:  imageSource2->SetDrawColor(0.0);

 18:  imageSource2->FillBox(0,100,0,100);

 19:   imageSource2->SetDrawColor(255.0);

 20:  imageSource2->FillBox(40,80,40,80);

 21:   imageSource2->Update();

 22:  

 23:  vtkSmartPointer<vtkImageLogic> imageLogic =

 24:    vtkSmartPointer<vtkImageLogic>::New();

 25:  imageLogic->SetInput1(imageSource1->GetOutput());

 26:  imageLogic->SetInput2(imageSource2->GetOutput());

 27:  imageLogic->SetOperationToXor();

 28:  imageLogic->SetOutputTrueValue(128);

 29:   imageLogic->Update();

 

上例中首先生成了两个二值图像,两个图像中前景为两个部分重叠矩形。然后定义vtkImageLogic对象,并设置两个图像为输入,SetOperationToXor()设置逻辑操作算子为异或操作,并且SetOutputTrueValue()设置当两个图像对应像素值异或结果为真时的输出像素值,其执行结果如下,可以看成两个矩形的重叠部分像素值相同,因此输出为0;矩形的不重叠部分像素值一个为0,一个为255,因此异或结果为真,那么输出值为128。

 

图5.24 图像逻辑运算

vtkImageLogic设置逻辑运算的函数有:

SetOperationToAnd():逻辑与操作

SetOperationToOr():逻辑或操作

SetOperationToXor():逻辑异或

SetOperationToNand():逻辑与非

SetOperationToNor():逻辑或非

SetOperationToNot():逻辑非

5.11 图像二值化

二值图像和label图像是图像分割中经常用到的两种图像。二值图像的每个像素只有两种可能的取值,例如0或者255。通常0代表图像的背景,而255代码图像前景。图像二值化是最简单的图像分割模型。设置一个灰度阈值,将图像中阈值以下的像素值设置为背景,阈值以上的像素值设置为前景,即可得当一副二值图像。在VTK中可以通过vtkImageThreshold类实现图像二值化。

 

1:      vtkSmartPointer<vtkJPEGReader>reader =

  2:         vtkSmartPointer<vtkJPEGReader>::New();

  3:      reader->SetFileName("lena2.jpg" );

  4:      reader->Update();

  5:  

  6:     vtkSmartPointer<vtkImageThreshold> thresholdFilter =

  7:         vtkSmartPointer<vtkImageThreshold>::New();

  8:     thresholdFilter->SetInputConnection(reader->GetOutputPort());

  9:      thresholdFilter->ThresholdByUpper(100);

 10:     thresholdFilter->SetInValue(255);

 11:     thresholdFilter->SetOutValue(0);

 11:     thresholdFilter->Update();

 

vtkImageThreshold类实现图像的阈值化处理,其功能不仅仅是生成二值图像。在本例中,我们以图像二值化操作为例来介绍该类。vtkImageThreshold类中定义了两个阈值,UpperThreshold和LowerThreshold,这两个值将图像的值域划分为三部分:大于UpperThreshold,小于LowerThreshold,以及位于LowerThreshold和UpperThreshold之间的三段。函数ThresholdByUpper()设置为取大于UpperThreshold的灰度范围为有效范围,并通过函数SetInValue()来设置该范围内的输出值,SetOutValue()设置范围外的输出值,本例中取大于100所有像素输出值为255,而小于100的像素值为0。该例的结果执行如下。

 

图5.25 图像二值化

另外还有其他两种方式,ThresholdByLower()取小于LowerThreshold的范围为有效范围;ThresholdBetween()取LowerThreshold和UpperThreshold之间的部分为有效范围。另外SetInValue()和SetOutValue()如果不设置的话,图像会按原图输出。可以通过该类来实现图像数据范围的截断操作。

对于二值图像前景由多个对象组成,而每个对象是一个连通分量,对象之间不存在连通关系。在处理图像时,需要将不同的对象分别提取出来或者将不同对象赋一个label值,这样得到的图像成为label图像。目前VTK中没有提取二值图像连通分量的filter以及相应的对二值图像label化的filter。如果要实现该功能,可以考虑与ITK相结合。

==========欢迎转载,转载时请保留该声明信息==========

版权归@东灵工作室所有,更多信息请访问东灵工作室


教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686

================================================



© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片