VTK学习笔记(三十五)VTK最大连通域提取
1、源码自带示例
/*=========================================================================
Program: Visualization Toolkit
Module: ImageConnectivityFilter.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// Test the ImageConnectivityFilter class
//
// The command line arguments are:
// -I => run in interactive mode
#include "vtkCamera.h"
#include "vtkIdTypeArray.h"
#include "vtkImageConnectivityFilter.h"
#include "vtkImageData.h"
#include "vtkImageProperty.h"
#include "vtkImageReader2.h"
#include "vtkImageSlice.h"
#include "vtkImageSliceMapper.h"
#include "vtkIntArray.h"
#include "vtkInteractorStyleImage.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkSmartPointer.h"
#include "vtkUnsignedCharArray.h"
#include "vtkVersion.h"
#include "vtkTestUtilities.h"
#include <string>
int TestImageConnectivityFilter(int argc, char* argv[])
{
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();
style->SetInteractionModeToImageSlicing();
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
iren->SetRenderWindow(renWin);
iren->SetInteractorStyle(style);
// Use a 3D image for the test
char* temp = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/headsq/quarter");
std::string fname = temp;
delete[] temp;
vtkSmartPointer<vtkImageReader2> reader = vtkSmartPointer<vtkImageReader2>::New();
reader->SetDataByteOrderToLittleEndian();
reader->SetDataExtent(0, 63, 0, 63, 2, 4);
reader->SetDataSpacing(3.2, 3.2, 1.5);
reader->SetFilePrefix(fname.c_str());
// Create two seed points
vtkSmartPointer<vtkPoints> seedPoints = vtkSmartPointer<vtkPoints>::New();
seedPoints->InsertNextPoint(25.6, 100.8, 2.25);
seedPoints->InsertNextPoint(100.8, 100.8, 2.25);
vtkSmartPointer<vtkUnsignedCharArray> seedScalars = vtkSmartPointer<vtkUnsignedCharArray>::New();
seedScalars->InsertNextValue(2);
seedScalars->InsertNextValue(5);
vtkSmartPointer<vtkPolyData> seedData = vtkSmartPointer<vtkPolyData>::New();
seedData->SetPoints(seedPoints);
seedData->GetPointData()->SetScalars(seedScalars);
// Generate a grid of renderers for the various tests
for (int i = 0; i < 9; i++)
{
int j = 2 - i / 3;
int k = i % 3;
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkCamera* camera = renderer->GetActiveCamera();
renderer->SetBackground(0.0, 0.0, 0.0);
renderer->SetViewport(k / 3.0, j / 3.0, (k + 1) / 3.0, (j + 1) / 3.0);
renWin->AddRenderer(renderer);
vtkSmartPointer<vtkImageConnectivityFilter> connectivity =
vtkSmartPointer<vtkImageConnectivityFilter>::New();
connectivity->SetInputConnection(reader->GetOutputPort());
if (i == 0)
{
connectivity->GenerateRegionExtentsOn();
connectivity->SetScalarRange(800, 1200);
// No seeds
// Default extraction mode
// Default label mode
}
else if (i == 1)
{
connectivity->SetScalarRange(800, 1200);
// No seeds
connectivity->SetExtractionModeToLargestRegion();
// Default label mode
}
else if (i == 2)
{
connectivity->SetScalarRange(800, 1200);
// No seeds
connectivity->SetSizeRange(10, 99);
// Default label mode
}
else if (i == 3)
{
connectivity->SetScalarRange(800, 1200);
connectivity->SetSeedData(seedData);
// Default extraction mode
// Default label mode (use seed scalars)
}
else if (i == 4)
{
connectivity->SetScalarRange(800, 1200);
connectivity->SetSeedData(seedData);
connectivity->SetExtractionModeToAllRegions();
connectivity->SetLabelModeToSizeRank();
}
else if (i == 5)
{
// Seeds with no scalars
connectivity->SetScalarRange(800, 1200);
seedData->GetPointData()->SetScalars(nullptr);
connectivity->SetSeedData(seedData);
}
else if (i == 6)
{
connectivity->SetScalarRange(1200, 4095);
}
else if (i == 7)
{
connectivity->SetScalarRange(0, 800);
}
else if (i == 8)
{
// use default scalar range
}
if (i == 0)
{
// Test OutputExtent != InputExtent
int extent[6] = {
0, 63, 0, 63, 3, 3 };
connectivity->UpdateExtent(extent);
}
else
{
// Test updating whole extent
connectivity->Update();
}
// Test getting info about the output regions
vtkIdTypeArray* sizeArray = connectivity->GetExtractedRegionSizes();
vtkIdTypeArray* idArray = connectivity->GetExtractedRegionSeedIds();
vtkIdTypeArray* labelArray = connectivity->GetExtractedRegionLabels();
vtkIntArray* extentArray = connectivity->GetExtractedRegionExtents();
vtkIdType rn = connectivity->GetNumberOfExtractedRegions();
std::cout << "\nTest Case: " << i << std::endl;
std::cout << "number of regions: " << rn << std::endl;
for (vtkIdType r = 0; r < rn; r++)
{
std::cout << "region: " << r << ","
<< " seed: " << idArray->GetValue(r) << ","
<< " label: " << labelArray->GetValue(r) << ","
<< " size: " << sizeArray->GetValue(r) << ","
<< " extent: [";
if (connectivity->GetGenerateRegionExtents())
{
std::cout << extentArray->GetValue(6 * r) << "," << extentArray->GetValue(6 * r + 1) << ","
<< extentArray->GetValue(6 * r + 2) << "," << extentArray->GetValue(6 * r + 3)
<< "," << extentArray->GetValue(6 * r + 4) << ","
<< extentArray->GetValue(6 * r + 5);
}
std::cout << "]" << std::endl;
}
vtkSmartPointer<vtkImageSliceMapper> imageMapper = vtkSmartPointer<vtkImageSliceMapper>::New();
imageMapper->SetInputConnection(connectivity->GetOutputPort());
imageMapper->BorderOn();
imageMapper->SliceFacesCameraOn();
imageMapper->SliceAtFocalPointOn();
double point[3] = {
100.8, 100.8, 5.25 };
camera->SetFocalPoint(point);
point[2] += 500.0;
camera->SetPosition(point);
camera->SetViewUp(0.0, 1.0, 0.0);
camera->ParallelProjectionOn();
camera->SetParallelScale(3.2 * 32);
vtkSmartPointer<vtkImageSlice> image = vtkSmartPointer<vtkImageSlice>::New();
image->SetMapper(imageMapper);
image->GetProperty()->SetColorWindow(6);
image->GetProperty()->SetColorLevel(3);
renderer->AddViewProp(image);
}
renWin->SetSize(192, 256);
iren->Initialize();
renWin->Render();
iren->Start();
return EXIT_SUCCESS;
}
跑通程序结果:
Test Case: 0
number of regions: 10
region: 0, seed: -1, label: 1, size: 147, extent: [14,42,3,12,2,4]
region: 1, seed: -1, label: 2, size: 38, extent: [43,50,7,13,2,4]
region: 2, seed: -1, label: 3, size: 4039, extent: [11,51,8,53,2,4]
region: 3, seed: -1, label: 4, size: 3, extent: [13,13,13,13,2,4]
region: 4, seed: -1, label: 5, size: 5, extent: [51,51,13,14,2,4]
region: 5, seed: -1, label: 6, size: 12, extent: [11,12,14,16,2,4]
region: 6, seed: -1, label: 7, size: 6, extent: [52,52,15,16,2,4]
region: 7, seed: -1, label: 8, size: 367, extent: [7,44,17,57,2,4]
region: 8, seed: -1, label: 9, size: 224, extent: [46,55,17,51,2,4]
region: 9, seed: -1, label: 10, size: 4, extent: [44,45,52,52,2,4]
Test Case: 1
number of regions: 1
region: 0, seed: -1, label: 1, size: 4039, extent: []
Test Case: 2
number of regions: 2
region: 0, seed: -1, label: 1, size: 38, extent: []
region: 1, seed: -1, label: 2, size: 12, extent: []
Test Case: 3
number of regions: 2
region: 0, seed: 0, label: 2, size: 367, extent: []
region: 1, seed: 1, label: 5, size: 4039, extent: []
Test Case: 4
number of regions: 10
region: 0, seed: 1, label: 1, size: 4039, extent: []
region: 1, seed: 0, label: 2, size: 367, extent: []
region: 2, seed: -1, label: 3, size: 224, extent: []
region: 3, seed: -1, label: 4, size: 147, extent: []
region: 4, seed: -1, label: 5, size: 38, extent: []
region: 5, seed: -1, label: 6, size: 12, extent: []
region: 6, seed: -1, label: 7, size: 6, extent: []
region: 7, seed: -1, label: 8, size: 5, extent: []
region: 8, seed: -1, label: 9, size: 4, extent: []
region: 9, seed: -1, label: 10, size: 3, extent: []
Test Case: 5
number of regions: 2
region: 0, seed: 0, label: 1, size: 367, extent: []
region: 1, seed: 1, label: 2, size: 4039, extent: []
Test Case: 6
number of regions: 1
region: 0, seed: -1, label: 1, size: 1331, extent: []
Test Case: 7
number of regions: 1
region: 0, seed: -1, label: 1, size: 6115, extent: []
Test Case: 8
number of regions: 1
region: 0, seed: -1, label: 1, size: 12288, extent: []