0
点赞
收藏
分享

微信扫一扫

VTK_Learning_图像像素的访问与修改


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;
}

输出结果:

 

举报

相关推荐

0 条评论