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
================================================
總結
- 上一篇: 临床外显子组测序分析中的那些坑(下)
- 下一篇: 5.8 直方图统计