[VTK 연구 노트-07] VTK 이미지 표시(vtkImageViewer2는 2차원 이미지 표시, vtkImageActor 3차원 이미지 렌더링, vtkImageBlend 이미지 융합)

학습 튜토리얼: "고급 VTK 그래픽 및 이미지 개발" Zhang Xiaodong, Luo Huoling
특별 감사: Dongling Studio

5.2 VTK 이미지 디스플레이

5.2.1 vtkImageViewer2——2차원 이미지 표시

특히 3차원 이미지의 슬라이스 표시에 적합합니다.

예 - *.mhd 형식으로 3D 의료 이미지의 특정 조각을 표시합니다.
소스 코드:

#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkMetaImageReader.h>

//测试图像:../data/brain.mhd  
int main()
{
    
    
	//使用vtkMetaImageReader读入一个*.mhd格式的图像
	vtkSmartPointer<vtkMetaImageReader>reader = vtkSmartPointer<vtkMetaImageReader>::New();
	reader->SetFileName("../data/brain.mhd");
	reader->Update();

	vtkSmartPointer<vtkImageViewer2>imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
	imageViewer->SetInputConnection(reader->GetOutputPort());

	//显示切片
	vtkSmartPointer<vtkRenderWindowInteractor>renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	imageViewer->SetupInteractor(renderWindowInteractor);

	imageViewer->SetColorLevel(500);//窗位
	imageViewer->SetColorWindow(2000);//窗宽
	imageViewer->SetSlice(40);//切片索引
	imageViewer->SetSliceOrientationToXY();//切片方向
	imageViewer->Render();

	imageViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
	imageViewer->SetSize(640, 480);
	imageViewer->GetRenderWindow()->SetWindowName("DisplayImageExample");

	renderWindowInteractor->Start();

	return 0;
}

작업 결과:
여기에 이미지 설명을 삽입하세요.

5.2.2 vtkImageActor——3D 이미지 렌더링

텍스처 매핑은 표시를 위해 이미지를 다각형에 매핑합니다.
vtkBMPReader를 사용하여 이미지를 읽은 후 vtkImageActor, vtkRender, vtkRenderWindow 및 vtkRenderWindowInteractor를 순서대로 생성합니다. 또한 vtkInteractorStyleImage 객체를 정의하고 이를 렌더링 파이프라인으로 어셈블해야 합니다.
소스 코드:

#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkBMPReader.h>
#include <vtkImageActor.h>


//测试图像:../data/lena.bmp
int main()
{
    
    
	//读取图片
	vtkSmartPointer<vtkBMPReader>reader = vtkSmartPointer<vtkBMPReader>::New();
	reader->SetFileName("../data/lena.bmp");
	reader->Update();

	//渲染管线
	vtkSmartPointer<vtkImageActor>imgActor = vtkSmartPointer<vtkImageActor>::New();
	imgActor->SetInputData(reader->GetOutput());

	vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(imgActor);
	renderer->SetBackground(1.0, 1.0, 1.0);

	vtkSmartPointer<vtkRenderWindow>renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	renderWindow->SetSize(640, 480);
	renderWindow->Render();
	renderWindow->SetWindowName("DisplayImageExample2");

	vtkSmartPointer<vtkRenderWindowInteractor>renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();

	renderWindowInteractor->SetInteractorStyle(style);
	renderWindowInteractor->SetRenderWindow(renderWindow);
	renderWindowInteractor->Initialize();

	renderWindowInteractor->Start();

	return 0;

}

작업 결과:
여기에 이미지 설명을 삽입하세요.

참고: vtkImageActor가 수신한 이미지 데이터 vtkImageData의 픽셀 유형은 unsigned char이어야 하며 유형이 요구 사항을 충족하지 않는 경우 이미지를 표시하기 전에 이미지 데이터 유형을 unsigned char로 변환해야 합니다.

컴파일하는 동안 오류가 발생했습니다 “vktSmartPointer”: 未声明的标识符. 해결책은 다음과 같습니다! ! VS에서 오류 줄을 삭제하고 메모장에서 똑같은 줄을 다시 작성한 다음 붙여넣으면 괜찮습니다. 놀라운!

5.2.3 vtkImageBlend - 이미지 융합

이미지 융합: 이미지의 불투명도를 사용하여 이미지를 합성합니다. 이미지 융합을 달성하려면 vtkImageBlend 클래스를 사용하세요. vtkImageBlend는 여러 이미지 입력을 허용할 수 있으며 출력 이미지는 융합된 이미지입니다.

두 가지 융합 모드: 표준 모드(기본값), 혼합 모드
(1) 표준 모드
(2) 혼합 모드
출력 결과는 불투명도를 사용하여 정규화됩니다.

예: 회색조 이미지를 읽고, 이진 이미지를 생성하고, 이미지를 융합합니다(회색조 이미지와 이진 이미지의 융합). 마지막으로 세 개의 이미지가 창 내에 표시됩니다.
소스 코드:

#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkImageBlend.h>
#include <vtkJPEGReader.h>
#include <vtkImageActor.h>
#include <vtkImageCast.h>

//测试图像:../data/lena-gray.jpg
int main()
{
    
    
	//读入灰度图像      
	vtkSmartPointer<vtkJPEGReader>reader = vtkSmartPointer<vtkJPEGReader>::New();
	reader->SetFileName("../data/lena-gray.jpg");
	reader->Update();

	//生成二值图像      
	vtkSmartPointer<vtkImageCanvasSource2D>imageSource = vtkSmartPointer<vtkImageCanvasSource2D>::New();
	imageSource->SetNumberOfScalarComponents(1);
	imageSource->SetScalarTypeToUnsignedChar();
	imageSource->SetExtent(0, 512, 0, 512, 0, 0);
	imageSource->SetDrawColor(0.0);
	imageSource->FillBox(0, 512, 0, 512);
	imageSource->SetDrawColor(255.0);
	imageSource->FillBox(100,400,100,400);
	imageSource->Update();

	//融合图像:两个输入(0:灰度图像;1:二值图像)
	vtkSmartPointer<vtkImageBlend>imageBlend = vtkSmartPointer<vtkImageBlend>::New();
	//imageBlend->SetInputData(0, (vtkDataObject*)reader->GetOutput());
	//imageBlend->SetInputData(1, (vtkDataObject*)imageSource->GetOutput()); // 这样写不能显示融合图像
	imageBlend->AddInputData(reader->GetOutput());
	imageBlend->AddInputData(imageSource->GetOutput()); //修改为Add,然后取消编号就ok
	imageBlend->SetOpacity(0, 0.4);
	imageBlend->SetOpacity(1, 0.6);  //用于设置对应id号的图像不透明度的大小
	imageBlend->Update();

	//显示三组图像
	//(1)创建actors
	vtkSmartPointer<vtkImageActor>originalActor1 = vtkSmartPointer<vtkImageActor>::New();
	originalActor1->SetInputData(reader->GetOutput());

	vtkSmartPointer<vtkImageActor>originalActor2 = vtkSmartPointer<vtkImageActor>::New();
	originalActor2->SetInputData(imageSource->GetOutput());

	vtkSmartPointer<vtkImageActor>blendActor = vtkSmartPointer<vtkImageActor>::New();
	blendActor->SetInputData(imageBlend->GetOutput());

	//(2)定义viewport范围 (xmin,ymin,xmax,ymax)
	double leftViewport[4] = {
    
     0.0,0.0,0.33,1.0 };
	double midViewport[4] = {
    
     0.33,0.0,0.66,1.0 };
	double rightViewport[4] = {
    
     0.66,0.0,1.0,1.0 };

	//(3)创建渲染示例renderers
	vtkSmartPointer<vtkRenderer>originalRenderer1 = vtkSmartPointer<vtkRenderer>::New();
	originalRenderer1->SetViewport(leftViewport);
	originalRenderer1->AddActor(originalActor1);
	originalRenderer1->ResetCamera();
	originalRenderer1->SetBackground(1.0, 1.0, 1.0);

	vtkSmartPointer<vtkRenderer>originalRenderer2 = vtkSmartPointer<vtkRenderer>::New();
	originalRenderer2->SetViewport(midViewport);
	originalRenderer2->AddActor(originalActor2);
	originalRenderer2->ResetCamera();
	originalRenderer2->SetBackground(1.0, 1.0, 1.0);

	vtkSmartPointer<vtkRenderer>blendRenderer = vtkSmartPointer<vtkRenderer>::New();
	blendRenderer->SetViewport(rightViewport);
	blendRenderer->AddActor(blendActor);
	blendRenderer->ResetCamera();
	blendRenderer->SetBackground(1.0, 1.0, 1.0);

	//(4)创建渲染窗口renderWindow
	vtkSmartPointer<vtkRenderWindow>renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(originalRenderer1);
	renderWindow->AddRenderer(originalRenderer2);
	renderWindow->AddRenderer(blendRenderer);
	renderWindow->SetSize(640, 320);
	renderWindow->Render();
	renderWindow->SetWindowName("ImageBlendExample");

	//(5)创建交互RenderWindowInteractor以及交互样式
	vtkSmartPointer<vtkRenderWindowInteractor>renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();
	renderWindowInteractor->SetInteractorStyle(style);
	renderWindowInteractor->SetRenderWindow(renderWindow);
	renderWindowInteractor->Initialize();
	renderWindowInteractor->Start();

	return 0;
}

작업 결과:
여기에 이미지 설명을 삽입하세요.

문제: Fusion 이미지가 표시되지 않습니다
. 오류 메시지:vtkCompositeDataPipeline (00000201D3E32960): Input for connection index 0 on input port index 1 for algorithm vtkImageBlend(00000201D3E1F930) is of type vtkImageData, but a vtkImageStencilData is required.

오류 수정을 위한 참조: VTK Notes-Image Fusion-02-vtkImageBlend 클래스
참고: VTK 버전이 호환되지 않아 SetInput()을 사용할 수 없게 됩니다.

  • 파이프 연결을 설정하려면 SetInputConnection(), GetOutputPort()를 사용하십시오.
  • 독립적인 데이터 세트를 처리하려면 SetInputData()를 사용하십시오.

Supongo que te gusta

Origin blog.csdn.net/m0_51141265/article/details/132825554
Recomendado
Clasificación