彩色图像由于内部有三个通道,不能直接计算直方图,需要提取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对象建立可视化管道来显示图像直方图曲线。本例的显示效果如下:其中,红色曲线代码红色分量的直方图,绿色代表绿色分量的直方图曲线,蓝色代码蓝色分量的直方图曲线。
VTK 图像统计_彩色直方图计算
转载1.彩色图像直方图
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
下一篇:VTK 图像统计_灰度直方图计算
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
浅析MySQL 8.0直方图原理
本文将对直方图概念进行介绍,借助举例描述直方图的使用方式,对创建/删除直方图的原理进行浅析,并通过例子说明其应用场景。
直方图 mysql 执行计划 查询优化 -
HP7740彩色打印机无法打印彩色,首选项报错
HP7740 无法打印彩色 首选项无法设置
首选项 无法打印彩色 HP7740