VTK修炼之道29:图像统计_彩色直方图计算
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道29:图像统计_彩色直方图计算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.彩色圖像直方圖
彩色圖像由于內部有三個通道,不能直接計算直方圖,需要提取RGB三個通道數據,分別計算直方圖。每個通道計算直方圖的方法與灰度圖像直方圖計算方法一致。 實例代碼如下: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h> #include <vtkBMPReader.h> #include <vtkImageData.h> #include <vtkXYPlotActor.h> #include <vtkProperty2D.h> #include <vtkTextProperty.h> #include <vtkImageExtractComponents.h> #include <vtkImageAccumulate.h>#include <vtkImageActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h>int main() {vtkSmartPointer<vtkBMPReader> reader =vtkSmartPointer<vtkBMPReader>::New();reader->SetFileName("lena.bmp");reader->Update();int numComponents = reader->GetOutput()->GetNumberOfScalarComponents();//vtkSmartPointer<vtkXYPlotActor> plot =vtkSmartPointer<vtkXYPlotActor>::New();plot->ExchangeAxesOff();plot->SetLabelFormat("%g");plot->SetXTitle("灰度值");plot->SetYTitle("像素頻率");plot->SetXValuesToValue();plot->GetProperty()->SetColor(1.0, 1.0, 1.0);plot->GetAxisLabelTextProperty()->SetColor(0, 0, 0);plot->GetAxisTitleTextProperty()->SetColor(0, 0, 0);double colors[3][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } };const char* labels[3] = { "Red", "Green", "Blue" };int xmax = 0;int ymax = 0;for (int i = 0; i < numComponents; ++i){vtkSmartPointer<vtkImageExtractComponents> extract =vtkSmartPointer<vtkImageExtractComponents>::New();extract->SetInputConnection(reader->GetOutputPort());extract->SetComponents(i);extract->Update();double range[2];extract->GetOutput()->GetScalarRange(range);int extent = static_cast<int> (range[1]) - static_cast<int>(range[0]) - 1;vtkSmartPointer<vtkImageAccumulate> histogram =vtkSmartPointer<vtkImageAccumulate>::New();histogram->SetInputConnection(reader->GetOutputPort());histogram->SetComponentExtent(0,extent, 0, 0, 0, 0);histogram->SetComponentOrigin(range[0], 0, 0);histogram->SetComponentSpacing(1, 0, 0);histogram->SetIgnoreZero(1);histogram->Update();if (range[1] > xmax){xmax = range[1];}if (histogram->GetOutput()->GetScalarRange()[1] > ymax){ymax = histogram->GetOutput()->GetScalarRange()[1];}plot->AddDataSetInput(histogram->GetOutput());plot->SetPlotColor(i, colors[i]);plot->SetPlotLabel(i, labels[i]);plot->LegendOn();}plot->SetXRange(0, xmax);plot->SetYRange(0, ymax);/vtkSmartPointer<vtkImageActor> imgActor =vtkSmartPointer<vtkImageActor>::New();imgActor->SetInputData(reader->GetOutput());double imgView[4] = { 0.0, 0.0, 0.5, 1.0 };double histView[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkRenderer> imgRender =vtkSmartPointer<vtkRenderer>::New();imgRender->SetViewport(imgView);imgRender->AddActor(imgActor);imgRender->SetBackground(1.0, 0.0, 0.0);vtkSmartPointer<vtkRenderer> histRender =vtkSmartPointer<vtkRenderer>::New();histRender->SetViewport(histView);histRender->AddActor(plot);histRender->SetBackground(1.0, 1.0, 1.0);/vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(imgRender);rw->AddRenderer(histRender);rw->SetSize(640, 320);rw->SetWindowName("RGB-Image Histogram");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);rwi->Initialize();rwi->Start();return 0; }上面代碼說明了怎樣計算彩色圖像直方圖。 計算直方圖的主要代碼段是27-61行。由于彩色圖像不能直接計算直方圖,因此需要先通過vtkImageExtractComponents來提取每個通道圖像,然后再利用vtkImageAccumulate統計直方圖。在本例中計算直方圖的間隔取(1, 0, 0),即每個灰度計算統計一個頻率,而且灰度起點為圖像的最小灰度值,這樣間隔的個數即為:最大灰度值減去最小灰度值,再減1,如第37行代碼。同時,設置了SetIgnoreZero()為1,即在統計直方圖時,像素值為0的像素不進行統計。
在灰度圖像直方圖實例中,我們使用的是vtkBarChartActor柱狀圖來顯示直方圖,在本例中則使用vtkXYPlotActor曲線來表示直方圖。 vtkXYPlotActor類可以用來顯示二維曲線,它可以接收多個輸入數據,如本例中我們輸入了三條曲線,分別是圖像紅色分量直方圖區域,綠色分量直方圖曲線和藍色分量直方圖曲線。SetXRange()和SetYRange()用來設置X軸和Y軸的數據范圍,另外還可以設置X軸和Y軸的名字,曲線的標題等屬性,詳細可以查閱vtkXYPlotActor類的文檔。vtkXYPlotActor類是一個vtkActor2D的子類,因此定義相應的vtkRenderer,vtkRenderWindow和vtkRenderWindowInteractor對象建立可視化管道來顯示圖像直方圖曲線。 本例的顯示效果如下: 其中,紅色曲線代碼紅色分量的直方圖,綠色代表綠色分量的直方圖曲線,藍色代碼藍色分量的直方圖曲線。
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.
總結
以上是生活随笔為你收集整理的VTK修炼之道29:图像统计_彩色直方图计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows GDI和GDI+编程实例
- 下一篇: 纠结于wpf 多国语言方案,希望各位指点