日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

5.10 图像运算

發布時間:2025/3/15 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.10 图像运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。