vtk 05 访问图像像素

#include <vtkSmartPointer.h>

#include <vtkPNGReader.h>

#include <vtkImageViewer2.h>

#include <vtkRenderWindow.h>

#include <vtkRenderWindowInteractor.h>

#include <vtkRenderer.h>

#include <vtkBMPReader.h>

#include <vtkImageData.h>

#include <vtkImageIterator.h>

#include "vtkAutoInit.h"

VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2

VTK_MODULE_INIT(vtkInteractionStyle);


//测试图像:../data/lena.bmp

int main()

{

    vtkSmartPointer<vtkPNGReader> reader =

        vtkSmartPointer<vtkPNGReader>::New();

    reader->SetFileName("test1.png");

    reader->Update();


    使用迭代器

    //int subRegion[6] = { 0,300, 0, 300, 0, 0 };

    //vtkImageIterator<unsigned char> it(reader->GetOutput(), subRegion);


    //while (!it.IsAtEnd())

    //{

    //  unsigned char *inSI = it.BeginSpan();

    //  unsigned char *inSIEnd = it.EndSpan();


    //  while (inSI != inSIEnd)

    //  {

    //      *inSI = 255 - *inSI;

    //      ++inSI;

    //  }

    //  it.NextSpan();

    //}


   


    //使用指针

    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++)

            {

               

               

                    unsigned char * pixel =

                        (unsigned char *)(reader->GetOutput()->GetScalarPointer(i, j, k));

                    *pixel = 0;

                    *(pixel + 1) = 0;

                    *(pixel + 2) = 0;

               

            }

        }

    }

    unsigned char * pixel =

        (unsigned char *)(reader->GetOutput()->GetScalarPointer(200, 200, 0));

    *pixel = 255;

    *(pixel + 1) = 255;

    *(pixel + 2) = 255;



    //显示

    vtkSmartPointer<vtkImageViewer2> imageViewer =

        vtkSmartPointer<vtkImageViewer2>::New();

    imageViewer->SetInputConnection(reader->GetOutputPort());


    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =

        vtkSmartPointer<vtkRenderWindowInteractor>::New();

    imageViewer->SetupInteractor(renderWindowInteractor);

    imageViewer->Render();

    imageViewer->GetRenderer()->ResetCamera();

    imageViewer->Render();


    imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);

    imageViewer->SetSize(640, 480);

    imageViewer->GetRenderWindow()->SetWindowName("VisitImagePixelDirectlyExample");



    renderWindowInteractor->Start();


    return EXIT_SUCCESS;

}

 

VTK(Visualization Toolkit)中,获取像素点坐标通常涉及到渲染管道中的图像数据访问VTK提供了一个网格数据结构,其中包含了像素(或者说细胞)的位置信息。要获取这些像素点的坐标,你可以按照以下步骤操作: 1. **获取ImageData或StructuredGrid等数据类型**:首先,你需要从你的VTK数据集合(例如vtkImageData、vtkStructuredPoints等)中选择合适的数据类型。 ```cpp vtkImageData* imageData = ...; // 从VTK场景获取ImageData实例 ``` 2. **访问像素索引**:每个像素在二维图像上可以用一个索引表示,如行(row)和列(column)。对于ImageData,可以使用`GetPointData()`方法获得点数据,然后用索引来查找像素点。 ```cpp int pixelRow, pixelCol; imageData->GetPoint(pixelRow, pixelCol, pointIndex); ``` 3. **转换为笛卡尔坐标**:VTK内部可能存储的是图像空间的索引,你需要将其转换为实际的像素坐标。这可以通过调用`ComputeWorldCoordinates`方法,或者直接计算`(pixelRow * cellSize, pixelCol * cellSize)`,这里`cellSize`是图像的一个维度大小。 ```cpp double pixelX = pixelCol * imageData->GetSpacing(); double pixelY = pixelRow * imageData->GetSpacing(); ``` 4. **处理深度值(如有三维情况)**:如果图片是三维的,可能还需要一个额外的深度值。对于StructuredGrid,可以直接获取第3维索引,对于ImageData则可以通过索引映射得到。 ```cpp if (imageData->GetNumberOfComponents() == 3) { int depth = ...; // 获取深度索引 double pixelZ = imageData->GetPoint(depth, pixelX, pixelY); // 如果是ImageData,这里需要根据索引来查找对应深度 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值