5.8 直方图统计
5.8.1 灰度图像直方图
直方图统计是图像处理中的一个非常重要的操作。VTK中实现直方图统计功能的filter是vtkImageAccumulate。其将每个组分的数值范围划分为离散的间隔,然后统计每个灰度间隔上的像素数目。vtkImageAccumulate输入和输出都是vtkImageData类型,因此直方图也可以看做是一幅图像;对于输入图像的像素数据类型可以是任意的,但是最大支持3个组分像素类型,而输出图像的像素数据类型为int型。一个灰度图像的直方图为一个一维图像。首先来看一下怎么计算灰度图像直方图。
1: vtkSmartPointer<vtkJPEGReader> reader =
2: vtkSmartPointer<vtkJPEGReader>::New();
3: reader->SetFileName ( " lena2.jpg" );
4: reader->Update();
5:
6: int bins = 16;
7:
8: vtkSmartPointer<vtkImageAccumulate> histogram =
9: vtkSmartPointer<vtkImageAccumulate>::New();
10: histogram->SetInput(reader->GetOutput());
11: histogram->SetComponentExtent(0, bins-1, 0, 0, 0, 0);
12: histogram->SetComponentOrigin(0, 0, 0);
13: histogram->SetComponentSpacing(256/bins, 0, 0);
14: histogram->Update();
15:
16: vtkSmartPointer<vtkIntArray> frequencies =
17: vtkSmartPointer<vtkIntArray>::New();
18:
19: frequencies->SetNumberOfComponents(1);
20: frequencies->SetNumberOfTuples(bins);
21: int* output = static_cast<int*>(histogram->GetOutput()->GetScalarPointer());
22:
23: for(int j = 0; j < bins; ++j)
24: {
25: frequencies->SetTuple1(j, *output++);
26: }
27:
28: vtkSmartPointer<vtkDataObject> dataObject =
29: vtkSmartPointer<vtkDataObject>::New();
30: dataObject->GetFieldData()->AddArray( frequencies );
31:
32: vtkSmartPointer<vtkBarChartActor> barChart =
33: vtkSmartPointer<vtkBarChartActor>::New();
34:
35: barChart->SetInput(dataObject);
36: barChart->SetTitle("Histogram");
37: barChart->GetPositionCoordinate()->SetValue(0.05,0.05,0.0);
38: barChart->GetPosition2Coordinate()->SetValue(0.95,0.95,0.0);
39: barChart->GetProperty()->SetColor(1,1,1);
40:
41: barChart->GetLegendActor()->SetNumberOfEntries(
42: dataObject->GetFieldData()->GetArray(0)->GetNumberOfTuples());
43: barChart->LegendVisibilityOff();
44: barChart->LabelVisibilityOff();
45:
46: double red[3] = {1, 0, 0 };
47: for(int i = 0; i < bins; ++i)
48: {
49: barChart->SetBarColor(i, red );
50: }
51:
52: vtkSmartPointer<vtkRenderer> renderer =
53: vtkSmartPointer<vtkRenderer>::New();
54: renderer->AddActor(barChart);
55:
56: vtkSmartPointer<vtkRenderWindow> renderWindow =