zoukankan      html  css  js  c++  java
  • VTK 图像统计_彩色直方图计算

    1.彩色图像直方图

    彩色图像由于内部有三个通道,不能直接计算直方图,需要提取RGB三个通道数据,分别计算直方图。每个通道计算直方图的方法与灰度图像直方图计算方法一致。
    实例代码如下:
      1 #include <vtkAutoInit.h>
      2 VTK_MODULE_INIT(vtkRenderingOpenGL);
      3  
      4 #include <vtkSmartPointer.h>
      5 #include <vtkBMPReader.h>
      6 #include <vtkImageData.h>
      7 #include <vtkXYPlotActor.h>
      8 #include <vtkProperty2D.h>
      9 #include <vtkTextProperty.h>
     10 #include <vtkImageExtractComponents.h>
     11 #include <vtkImageAccumulate.h>
     12  
     13 #include <vtkImageActor.h>
     14 #include <vtkRenderer.h>
     15 #include <vtkRenderWindow.h>
     16 #include <vtkRenderWindowInteractor.h>
     17  
     18 int main()
     19 {
     20     vtkSmartPointer<vtkBMPReader> reader =
     21         vtkSmartPointer<vtkBMPReader>::New();
     22     reader->SetFileName("lena.bmp");
     23     reader->Update();
     24  
     25     int numComponents = reader->GetOutput()->GetNumberOfScalarComponents();
     26  
     27     //
     28     vtkSmartPointer<vtkXYPlotActor> plot =
     29         vtkSmartPointer<vtkXYPlotActor>::New();
     30     plot->ExchangeAxesOff();
     31     plot->SetLabelFormat("%g");
     32     plot->SetXTitle("灰度值");
     33     plot->SetYTitle("像素频率");
     34     plot->SetXValuesToValue();
     35     plot->GetProperty()->SetColor(1.0, 1.0, 1.0);
     36     plot->GetAxisLabelTextProperty()->SetColor(0, 0, 0);
     37     plot->GetAxisTitleTextProperty()->SetColor(0, 0, 0);
     38  
     39     double colors[3][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } };
     40     const char* labels[3] = { "Red", "Green", "Blue" };
     41     int xmax = 0;
     42     int ymax = 0;
     43     for (int i = 0; i < numComponents; ++i)
     44     {
     45         vtkSmartPointer<vtkImageExtractComponents> extract =
     46             vtkSmartPointer<vtkImageExtractComponents>::New();
     47         extract->SetInputConnection(reader->GetOutputPort());
     48         extract->SetComponents(i);
     49         extract->Update();
     50  
     51         double range[2];
     52         extract->GetOutput()->GetScalarRange(range);
     53         int extent = static_cast<int> (range[1]) - static_cast<int>(range[0]) - 1;
     54         
     55         vtkSmartPointer<vtkImageAccumulate> histogram =
     56             vtkSmartPointer<vtkImageAccumulate>::New();
     57         histogram->SetInputConnection(reader->GetOutputPort());
     58         histogram->SetComponentExtent(0,extent, 0, 0, 0, 0);
     59         histogram->SetComponentOrigin(range[0], 0, 0);
     60         histogram->SetComponentSpacing(1, 0, 0);
     61         histogram->SetIgnoreZero(1);
     62         histogram->Update();
     63  
     64         if (range[1] > xmax)
     65         {
     66             xmax = range[1];
     67         }
     68         if (histogram->GetOutput()->GetScalarRange()[1] > ymax)
     69         {
     70             ymax = histogram->GetOutput()->GetScalarRange()[1];
     71         }
     72         plot->AddDataSetInput(histogram->GetOutput());
     73         plot->SetPlotColor(i, colors[i]);
     74         plot->SetPlotLabel(i, labels[i]);
     75         plot->LegendOn();
     76     }
     77     plot->SetXRange(0, xmax);
     78     plot->SetYRange(0, ymax);
     79     /
     80     vtkSmartPointer<vtkImageActor> imgActor =
     81         vtkSmartPointer<vtkImageActor>::New();
     82     imgActor->SetInputData(reader->GetOutput());
     83     
     84     double imgView[4] = { 0.0, 0.0, 0.5, 1.0 };
     85     double histView[4] = { 0.5, 0.0, 1.0, 1.0 };
     86     vtkSmartPointer<vtkRenderer> imgRender =
     87         vtkSmartPointer<vtkRenderer>::New();
     88     imgRender->SetViewport(imgView);
     89     imgRender->AddActor(imgActor);
     90     imgRender->SetBackground(1.0, 0.0, 0.0);
     91  
     92     vtkSmartPointer<vtkRenderer> histRender =
     93         vtkSmartPointer<vtkRenderer>::New();
     94     histRender->SetViewport(histView);
     95     histRender->AddActor(plot);
     96     histRender->SetBackground(1.0, 1.0, 1.0);
     97     /
     98     vtkSmartPointer<vtkRenderWindow> rw =
     99         vtkSmartPointer<vtkRenderWindow>::New();
    100     rw->AddRenderer(imgRender);
    101     rw->AddRenderer(histRender);
    102     rw->SetSize(640, 320);
    103     rw->SetWindowName("RGB-Image Histogram");
    104  
    105     vtkSmartPointer<vtkRenderWindowInteractor> rwi =
    106         vtkSmartPointer<vtkRenderWindowInteractor>::New();
    107     rwi->SetRenderWindow(rw);
    108     rwi->Initialize();
    109  
    110     rwi->Start();
    111     return 0;
    112 }
    上面代码说明了怎样计算彩色图像直方图。
    计算直方图的主要代码段是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对象建立可视化管道来显示图像直方图曲线。
    本例的显示效果如下:
    其中,红色曲线代码红色分量的直方图,绿色代表绿色分量的直方图曲线,蓝色代码蓝色分量的直方图曲线。
  • 相关阅读:
    Linux启动网卡时出现RTNETLINK answers: File exists错误解决方法
    在Linux系统中应用su和sudo
    Python模块常用的几种安装方式
    安装php并使用nginx连接PHP
    查看Chrome浏览器扩展程序源码的两种方法
    angularJs中缓存数据,免去重复发起请求的几种写法
    underscore.js 分析6 map函数
    AngularJS中Directive指令系列
    $watch和$observe的使用
    $watch, $watchCollection, $watchGroup的使用
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14241377.html
Copyright © 2011-2022 走看看