ImageHistogram
VTKExamples/Cxx/Images/ImageHistogram
Code¶
ImageHistogram.cxx
#include <vtkSmartPointer.h> #include <vtkImageHistogram.h> #include <vtkImageReader2Factory.h> #include <vtkImageReader2.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkCamera.h> #include <vtkImageData.h> #include <vtkImageSliceMapper.h> #include <vtkImageProperty.h> #include <vtkImageSlice.h> int main(int argc, char *argv[]) { if( argc < 2 ) { std::cout << "Usage: " << argv[0] << " filename" << std::endl; return EXIT_FAILURE; } vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); vtkSmartPointer<vtkInteractorStyle> style = vtkSmartPointer<vtkInteractorStyle>::New(); vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); iren->SetRenderWindow(renWin); iren->SetInteractorStyle(style); vtkSmartPointer<vtkImageReader2Factory> readerFactory = vtkSmartPointer<vtkImageReader2Factory>::New(); vtkSmartPointer<vtkImageReader2> reader; reader.TakeReference( readerFactory->CreateImageReader2(argv[1])); reader->SetFileName(argv[1]); vtkSmartPointer<vtkImageHistogram> histogram = vtkSmartPointer<vtkImageHistogram>::New(); histogram->SetInputConnection(reader->GetOutputPort()); histogram->GenerateHistogramImageOn(); histogram->SetHistogramImageSize(256,256); histogram->SetHistogramImageScaleToSqrt(); histogram->AutomaticBinningOn(); histogram->Update(); vtkIdType nbins = histogram->GetNumberOfBins(); double range[2]; range[0] = histogram->GetBinOrigin(); range[1] = range[0] + (nbins - 1)*histogram->GetBinSpacing(); for (int i = 0; i < 2; i++) { vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); vtkCamera *camera = renderer->GetActiveCamera(); renderer->SetViewport(0.5*(i&1), 0.0, 0.5 + 0.5*(i&1), 1.0); renWin->AddRenderer(renderer); vtkSmartPointer<vtkImageSliceMapper> imageMapper = vtkSmartPointer<vtkImageSliceMapper>::New(); // compute y range double yd; if ((i & 1) == 0) { imageMapper->SetInputConnection(reader->GetOutputPort()); int extent[6]; reader->GetOutput()->GetExtent(extent); yd = (extent[3] - extent[2] + 1); } else { imageMapper->SetInputConnection(histogram->GetOutputPort()); imageMapper->BorderOn(); int extent[6]; histogram->GetOutput()->GetExtent(extent); yd = (extent[3] - extent[2] + 1); } const double *bounds = imageMapper->GetBounds(); double point[3]; point[0] = 0.5*(bounds[0] + bounds[1]); point[1] = 0.5*(bounds[2] + bounds[3]); point[2] = 0.5*(bounds[4] + bounds[5]); camera->SetFocalPoint(point); point[imageMapper->GetOrientation()] += 1000; camera->SetPosition(point); camera->SetViewUp(0.0, 1.0, 0.0); camera->ParallelProjectionOn(); // Set scale so that vertical dimension fills the window camera->SetParallelScale(0.5 * yd); vtkSmartPointer<vtkImageSlice> image = vtkSmartPointer<vtkImageSlice>::New(); image->SetMapper(imageMapper); renderer->AddViewProp(image); if ((i & 1) == 0) { image->GetProperty()->SetColorWindow(range[1] - range[0]); image->GetProperty()->SetColorLevel(0.5*(range[0] + range[1])); } else { image->GetProperty()->SetInterpolationTypeToNearest(); image->GetProperty()->SetColorWindow(255.0); image->GetProperty()->SetColorLevel(127.5); } } renWin->SetSize(640, 480); iren->Initialize(); renWin->Render(); iren->Start(); return EXIT_SUCCESS; }
CMakeLists.txt¶
cmake_minimum_required(VERSION 3.3 FATAL_ERROR) project(ImageHistogram) find_package(VTK COMPONENTS vtkCommonCore vtkCommonDataModel vtkIOImage vtkImagingStatistics vtkInteractionStyle vtkRenderingContextOpenGL2 vtkRenderingCore vtkRenderingFreeType vtkRenderingGL2PSOpenGL2 vtkRenderingOpenGL2 QUIET) if (NOT VTK_FOUND) message("Skipping ImageHistogram: ${VTK_NOT_FOUND_MESSAGE}") return () endif() message (STATUS "VTK_VERSION: ${VTK_VERSION}") if (VTK_VERSION VERSION_LESS "8.90.0") # old system include(${VTK_USE_FILE}) add_executable(ImageHistogram MACOSX_BUNDLE ImageHistogram.cxx ) target_link_libraries(ImageHistogram PRIVATE ${VTK_LIBRARIES}) else () # include all components add_executable(ImageHistogram MACOSX_BUNDLE ImageHistogram.cxx ) target_link_libraries(ImageHistogram PRIVATE ${VTK_LIBRARIES}) # vtk_module_autoinit is needed vtk_module_autoinit( TARGETS ImageHistogram MODULES ${VTK_LIBRARIES} ) endif ()
Download and Build ImageHistogram¶
Click here to download ImageHistogram and its CMakeLists.txt file. Once the tarball ImageHistogram.tar has been downloaded and extracted,
cd ImageHistogram/build
If VTK is installed:
cmake ..
If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:
cmake -DVTK_DIR:PATH=/home/me/vtk_build ..
Build the project:
make
and run it:
./ImageHistogram
WINDOWS USERS
Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.