VTK修炼之道31:图像二值化_阈值法
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道31:图像二值化_阈值法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.閾值法實現圖像二值化操作
二值圖像和label圖像是圖像分割中經常用到的兩種圖像。 二值圖像的每個像素只有兩種可能的取值,例如0或者255。通常0代表圖像的背景,而255代碼圖像前景。圖像二值化是最簡單的圖像分割模型。設置一個灰度閾值,將圖像中閾值以下的像素值設置為背景,閾值以上的像素值設置為前景,即可得當一副二值圖像。 在VTK中可以通過vtkImageThreshold類實現圖像二值化。 示例代碼如下: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h> #include <vtkJPEGReader.h> #include <vtkImageThreshold.h> #include <vtkImageActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h>int main() {vtkSmartPointer<vtkJPEGReader> reader =vtkSmartPointer<vtkJPEGReader>::New();reader->SetFileName("lena.jpg");reader->Update();vtkSmartPointer<vtkImageThreshold> threshould =vtkSmartPointer<vtkImageThreshold>::New();threshould->SetInputConnection(reader->GetOutputPort());threshould->ThresholdByUpper(90);threshould->SetInValue(255);threshould->SetOutValue(0);threshould->Update(); //算法執行后必須添加更新消息!!!vtkSmartPointer<vtkImageActor> origActor =vtkSmartPointer<vtkImageActor>::New();origActor->SetInputData(reader->GetOutput());vtkSmartPointer<vtkImageActor> binaryActor =vtkSmartPointer<vtkImageActor>::New();binaryActor->SetInputData(threshould->GetOutput());double origView[4] = { 0, 0, 0.5, 1 };double binaryView[4] = { 0.5, 0, 1, 1 };vtkSmartPointer<vtkRenderer> origRender =vtkSmartPointer<vtkRenderer>::New();origRender->SetViewport(origView);origRender->AddActor(origActor);origRender->ResetCamera();origRender->SetBackground(1, 0, 0);vtkSmartPointer<vtkRenderer> binaryRender =vtkSmartPointer<vtkRenderer>::New();binaryRender->SetViewport(binaryView);binaryRender->AddActor(binaryActor);binaryRender->ResetCamera();binaryRender->SetBackground(1, 1, 1);/vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(origRender);rw->AddRenderer(binaryRender);rw->SetSize(640, 240);rw->SetWindowName("Binary Image");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style =vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(rw);rwi->Initialize();rwi->Start();return 0; }vtkImageThreshold類實現圖像的閾值化處理,其功能不僅僅是生成二值圖像。 在本例中,以圖像二值化操作為例來介紹該類。vtkImageThreshold類中定義了兩個閾值,UpperThreshold和LowerThreshold,這兩個值將圖像的值域劃分為三部分:大于UpperThreshold,小于LowerThreshold,以及位于LowerThreshold和UpperThreshold之間的三段。函數ThresholdByUpper()設置為取大于UpperThreshold的灰度范圍為有效范圍,并通過函數SetInValue()來設置該范圍內的輸出值,SetOutValue()設置范圍外的輸出值,本例中取大于100所有像素輸出值為255,而小于100的像素值為0。 該例的結果執行如下。
另外還有其他兩種方式,ThresholdByLower()取小于LowerThreshold的范圍為有效范圍;ThresholdBetween()取LowerThreshold和UpperThreshold之間的部分為有效范圍。另外SetInValue()和SetOutValue()如果不設置的話,圖像會按原圖輸出。可以通過該類來實現圖像數據范圍的截斷操作。
對于二值圖像前景由多個對象組成,而每個對象是一個連通分量,對象之間不存在連通關系。在處理圖像時,需要將不同的對象分別提取出來或將不同對象賦一個label值,這樣得到的圖像成為label圖像。目前VTK中沒有提取二值圖像連通分量的filter及相應的對二值圖像label化的filter。如果要實現該功能,可以考慮與ITK相結合。
2.參看資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
4. ?張曉東, 羅火靈. VTK圖形圖像開發進階[M]. 機械工業出版社, 2015. 與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的VTK修炼之道31:图像二值化_阈值法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VTK修炼之道30:图像重采样_降采样和
- 下一篇: Facebook与MySpace实现即时