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
================================================
暂无评论内容