5.10 图像运算
5.10.1 數(shù)學(xué)運(yùn)算
vtkImageMathematics提供了基本的一元和二元數(shù)學(xué)操作。根據(jù)不同的操作,需要一個(gè)或者兩個(gè)輸入圖像。二元數(shù)字操作要求兩個(gè)輸入圖像具有相同的像素?cái)?shù)據(jù)類型,顏色分量。當(dāng)兩個(gè)圖像大小不同時(shí),輸出圖像的范圍為兩個(gè)輸入圖像范圍的并集,并且原點(diǎn)和像素間隔與第一個(gè)輸入圖像保持一致。
?
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();
?
上例中生成了一副圖像,圖像中繪制了一個(gè)暗紅色矩形;然后定義vtkImageMathematics對象,并調(diào)用SetOperationToMultiplyByK()函數(shù)來將圖像中所有的像素值乘以一個(gè)常數(shù)K,這里常數(shù)值為2.0,下圖為輸出結(jié)果。
?
圖5.23 圖像數(shù)學(xué)運(yùn)算
?
vtkImageMathematics中支持的二元數(shù)學(xué)操作有:
SetOperationToAdd:兩個(gè)圖像對應(yīng)像素加法運(yùn)算
SetOperationToSubtract:兩個(gè)圖像對應(yīng)像素減法運(yùn)算
SetOperationToMultiply:兩個(gè)圖像對應(yīng)像素相乘運(yùn)算
SetOperationToDivide:兩個(gè)圖像對應(yīng)像素相除運(yùn)算
SetOperationToConjugate:將兩個(gè)標(biāo)量圖像對應(yīng)像素組合為共軛復(fù)數(shù)
SetOperationToComplexMultiply:兩個(gè)圖像對應(yīng)像素復(fù)數(shù)乘法運(yùn)算
SetOperationToMin:取兩個(gè)圖像中對應(yīng)像素較小值
SetOperationToMax:取兩個(gè)圖像中對應(yīng)像素較大值
一元操作有:
SetOperationToInvert:圖像像素值取倒數(shù)運(yùn)算
SetOperationToSin:圖像像素值正弦運(yùn)算
SetOperationToCos:圖像像素值余弦運(yùn)算
SetOperationToExp:圖像像素值自然指數(shù)運(yùn)算
SetOperationToLog:圖像像素值自然對數(shù)運(yùn)算
SetOperationToAbsoluteValue:圖像像素值取絕對值
SetOperationToSquare:圖像像素值平方運(yùn)算
SetOperationToSquareRoot:圖像像素值平凡根運(yùn)算
SetOperationToATAN:圖像像素值正切運(yùn)算
SetOperationToATAN2:圖像像素值反正切運(yùn)算
SetOperationToMultiplyByK:圖像像素值乘以常數(shù)K,需要先調(diào)用SetConstantK()設(shè)置K值
SetOperationToAddConstant:圖像像素值加上常數(shù)K,需要先調(diào)用SetConstantK()設(shè)置K值
SetOperationToReplaceCByK:將圖像中像素為C的像素值替換為K,需要先調(diào)用SetConstantK()和SetConstantC設(shè)置K和C值
5.10.2 邏輯運(yùn)算
vtkImageLogic接收一個(gè)或者兩個(gè)圖像進(jìn)行布爾邏輯運(yùn)算,該類主要支持與(AND),或(OR),異或(XOR),與非(NAND),或非(NOR)和非(NOT)。當(dāng)選擇一元操作符時(shí),只對第一個(gè)輸入圖像有效。 當(dāng)選擇二元操作符時(shí),兩個(gè)輸入圖像的類型必須一致。下面看一個(gè)實(shí)例。
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();
?
上例中首先生成了兩個(gè)二值圖像,兩個(gè)圖像中前景為兩個(gè)部分重疊矩形。然后定義vtkImageLogic對象,并設(shè)置兩個(gè)圖像為輸入,SetOperationToXor()設(shè)置邏輯操作算子為異或操作,并且SetOutputTrueValue()設(shè)置當(dāng)兩個(gè)圖像對應(yīng)像素值異或結(jié)果為真時(shí)的輸出像素值,其執(zhí)行結(jié)果如下,可以看成兩個(gè)矩形的重疊部分像素值相同,因此輸出為0;矩形的不重疊部分像素值一個(gè)為0,一個(gè)為255,因此異或結(jié)果為真,那么輸出值為128。
?
圖5.24 圖像邏輯運(yùn)算
vtkImageLogic設(shè)置邏輯運(yùn)算的函數(shù)有:
SetOperationToAnd():邏輯與操作
SetOperationToOr():邏輯或操作
SetOperationToXor():邏輯異或
SetOperationToNand():邏輯與非
SetOperationToNor():邏輯或非
SetOperationToNot():邏輯非
5.11 圖像二值化
二值圖像和label圖像是圖像分割中經(jīng)常用到的兩種圖像。二值圖像的每個(gè)像素只有兩種可能的取值,例如0或者255。通常0代表圖像的背景,而255代碼圖像前景。圖像二值化是最簡單的圖像分割模型。設(shè)置一個(gè)灰度閾值,將圖像中閾值以下的像素值設(shè)置為背景,閾值以上的像素值設(shè)置為前景,即可得當(dāng)一副二值圖像。在VTK中可以通過vtkImageThreshold類實(shí)現(xiàn)圖像二值化。
?
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類實(shí)現(xiàn)圖像的閾值化處理,其功能不僅僅是生成二值圖像。在本例中,我們以圖像二值化操作為例來介紹該類。vtkImageThreshold類中定義了兩個(gè)閾值,UpperThreshold和LowerThreshold,這兩個(gè)值將圖像的值域劃分為三部分:大于UpperThreshold,小于LowerThreshold,以及位于LowerThreshold和UpperThreshold之間的三段。函數(shù)ThresholdByUpper()設(shè)置為取大于UpperThreshold的灰度范圍為有效范圍,并通過函數(shù)SetInValue()來設(shè)置該范圍內(nèi)的輸出值,SetOutValue()設(shè)置范圍外的輸出值,本例中取大于100所有像素輸出值為255,而小于100的像素值為0。該例的結(jié)果執(zhí)行如下。
?
圖5.25 圖像二值化
另外還有其他兩種方式,ThresholdByLower()取小于LowerThreshold的范圍為有效范圍;ThresholdBetween()取LowerThreshold和UpperThreshold之間的部分為有效范圍。另外SetInValue()和SetOutValue()如果不設(shè)置的話,圖像會按原圖輸出??梢酝ㄟ^該類來實(shí)現(xiàn)圖像數(shù)據(jù)范圍的截?cái)嗖僮鳌?/p>
對于二值圖像前景由多個(gè)對象組成,而每個(gè)對象是一個(gè)連通分量,對象之間不存在連通關(guān)系。在處理圖像時(shí),需要將不同的對象分別提取出來或者將不同對象賦一個(gè)label值,這樣得到的圖像成為label圖像。目前VTK中沒有提取二值圖像連通分量的filter以及相應(yīng)的對二值圖像label化的filter。如果要實(shí)現(xiàn)該功能,可以考慮與ITK相結(jié)合。
==========歡迎轉(zhuǎn)載,轉(zhuǎn)載時(shí)請保留該聲明信息==========
版權(quán)歸@東靈工作室所有,更多信息請?jiān)L問東靈工作室
教程系列導(dǎo)航:http://blog.csdn.net/www_doling_net/article/details/8763686
================================================
總結(jié)
- 上一篇: 临床外显子组测序分析中的那些坑(下)
- 下一篇: 5.8 直方图统计