/*
*Vtk_ReadTiff.cpp
*VTK读取TIFF格式图片,修改像素值,显示图片
*2017-11-13
*/
#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkTIFFReader.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include "vtkImageReader2.h"
#include "vtkImageReslice.h"
#include "vtkWindowLevelLookupTable.h"
#include "vtkImageMapToColors.h"
#include "vtkImageActor.h"
#include "vtkImageData.h"
#include <stdio.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
char* fileName = "/home/zlf/Documents/VTK/VTKCODE/VTK_READTIFF/earth.tif";
vtkSmartPointer<vtkTIFFReader> reader = vtkSmartPointer<vtkTIFFReader>::New();
reader->SetFileName(fileName);
//加上这一句会报错 error: ‘class vtkImageData’ has no member named ‘UpdateInformation’
//但是不加的话,图像信息不会被更新进来,用reader->Update();代替
//reader->GetOutput()->UpdateInformation();
reader->Update();
//获取图像维数
int dims[3];
reader->GetOutput()->GetDimensions(dims);
cout<<"dims[0-3]: "<<dims[0]<<" "<<dims[1]<<" "<<dims[2]<<endl<<endl;
int extent[6];
double spacing[3];
double origin[3];
reader->GetOutput()->GetExtent(extent);
reader->GetOutput()->GetSpacing(spacing);
reader->GetOutput()->GetOrigin(origin);
// 计算中心位置。
double center[3];
center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);
cout<<"坐标原点";
cout<<"origin[0]: "<<origin[0]<<endl;
cout<<"origin[1]: "<<origin[1]<<endl;
cout<<"origin[2]: "<<origin[2]<<endl<<endl;
cout<<"像素间隔";
cout<<"spacing[0]: "<<spacing[0]<<endl;
cout<<"spacing[1]: "<<spacing[1]<<endl;
cout<<"spacing[2]: "<<spacing[2]<<endl<<endl;
cout<<"第一维数据范围extent[0-1]: "<<extent[0]<<" "<<extent[1]<<endl;
cout<<"第二维数据范围extent[0-1]: "<<extent[2]<<" "<<extent[3]<<endl;
cout<<"第三维数据范围extent[0-1]: "<<extent[4]<<" "<<extent[5]<<endl;
cout<<"图片中间";
cout<<"center[0]: "<<center[0]<<endl;
cout<<"center[1]: "<<center[0]<<endl;
cout<<"center[2]: "<<center[0]<<endl<<endl;
//打印原像素
int p = 0;
cout<<"[ red, green, blue ]"<<endl;
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 > 1500 && i < 1511 && j > 1500 && j < 1511) //10 * 10个像素,图片中间
{
unsigned char *pixel = (unsigned char *)(reader->GetOutput()->GetScalarPointer(i, j, k));
//无法直接cout unsigned char(范围: 0~255) 类型的变量,要转换成int型
cout<<"[ "<<int( *pixel )<<", "<<int( *(pixel + 1) )<<", "<<int( *(pixel + 2) )<<"] ";
p = p + 1;
if( (p%5)==0 ) //每5个一换行
{
cout<<endl;
}
}
}
}
}
//修改原像素
p = 0;
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 > 0 && i < 501 && j > 0 && j < 501) //500 * 500个像素,图片左下角
{
unsigned char *pixel = (unsigned char *)(reader->GetOutput()->GetScalarPointer(i, j, k));
*pixel = 255 ; //red分量: 新像素值改为255
*(pixel + 1) = 255 - *(pixel + 1); //green分量: 新像素值用255减去原来像素值
*(pixel + 2) = 255 - *(pixel + 2); //blue分量: 新像素值用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();
renderWindowInteractor->Start();
return 0;
}
/
/
# CMakeList.txt
# 2017-11-13
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT( VTK_READTIFF )
FIND_PACKAGE( VTK REQUIRED )
INCLUDE( ${VTK_USE_FILE} )
ADD_EXECUTABLE( Vtk_ReadTiff_Install Vtk_ReadTiff.cpp)
TARGET_LINK_LIBRARIES( Vtk_ReadTiff_Install ${VTK_LIBRARIES} )
/
结果如下:
/
参考:http://blog.csdn.net/ljp1919/article/details/8763913
参考: http://blog.csdn.net/u012176176/article/details/51286116