1.直接访问图像像素(索引法)
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkBMPReader.h>
#include <vtkImageViewer2.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
int main()
{
vtkSmartPointer<vtkBMPReader> reader =
vtkSmartPointer<vtkBMPReader>::New();
reader->SetFileName("lena.bmp");
reader->Update();
int dims[3];
reader->GetOutput()->GetDimensions(dims);
int nbofComp;
nbofComp = reader->GetOutput()->GetNumberOfScalarComponents();
for (int k = 0; k < dims[2]; k++)
{
for (int j = 0; j < dims[1]; j++)
{
for (int i = 0; i < dims[0]; i++)
{
if (i < 384 && i > 128 && j > 128 && j < 384)
{
unsigned char *pixel = (unsigned char *)(reader->GetOutput()->GetScalarPointer(i, j, k));
*pixel = 255 - *pixel;
*(pixel + 1) = 255 - *(pixel + 1);
*(pixel + 2) = 255 - *(pixel + 2);
}
}
}
}
vtkSmartPointer<vtkImageViewer2> imgViewer =
vtkSmartPointer<vtkImageViewer2>::New();
imgViewer->SetInputData(reader->GetOutput());
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
imgViewer->SetupInteractor(rwi);
imgViewer->Render();
imgViewer->GetRenderer()->ResetCamera();
imgViewer->Render();
imgViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
imgViewer->SetSize(640, 480);
imgViewer->GetRenderWindow()->SetWindowName("VisitImagePixelDirectly");
rwi->Start();
return 0;
}
输出结果:
2.迭代器方法访问图像像素
另外VTK中提供了vtkImageIterator类来利用迭代器方法访问图像像素。该类是一个模板类,使用时,需要提供迭代的图像像素类型以及迭代的区域大小。
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
#include <vtkSmartPointer.h>
#include <vtkBMPReader.h>
#include <vtkImageData.h>
#include <vtkImageIterator.h>
#include <vtkImageViewer2.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
int main()
{
vtkSmartPointer<vtkBMPReader> reader =
vtkSmartPointer<vtkBMPReader>::New();
reader->SetFileName("lena.bmp");
reader->Update();
int subRegion[6] = { 64, 448, 64, 448, 0, 0 };
vtkImageIterator<unsigned char> iter(reader->GetOutput(),subRegion);
while (!iter.IsAtEnd())
{
unsigned char *inSI = iter.BeginSpan();
unsigned char *inSIEnd = iter.EndSpan();
while ( inSI != inSIEnd )
{
*inSI = 255 - *inSI;
++inSI;
}
iter.NextSpan();
}
vtkSmartPointer<vtkImageViewer2> imgViewer =
vtkSmartPointer<vtkImageViewer2>::New();
imgViewer->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
imgViewer->SetupInteractor(rwi);
imgViewer->Render();
imgViewer->GetRenderer()->ResetCamera();
imgViewer->Render();
imgViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
imgViewer->SetSize(640, 480);
imgViewer->GetRenderWindow()->SetWindowName("VisitImagePixelIteratively");
rwi->Start();
return 0;
}
输出结果: