VTK实现Dicom文件的读取及显示
程序员文章站
2022-03-31 23:03:31
...
VTK提供了vtkDICOMImageReader类来读取DICOM文件,但没有提供DICOM图像的写操作,即没有提供vtkDICOMImageWriter类,ITK提供了对DICOM文件的完整操作,我们可以结合ITK来实现DICOM文件完整的读写操作。
vtkDICOMImageReader类使用也比较简单,读取单帧DICOM图像和其他图像读取类的使用方法类似,我们这里重点关注一下多帧DICOM图像的读取,即读取一个文件夹中所有的DICOM文件进行显示。
#include <vtkSmartPointer.h>
#include <vtkObjectFactory.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkActor.h>
#include <vtkImageViewer2.h>
#include <vtkDICOMImageReader.h>
#include <vtkInteractorStyleImage.h>
#include <vtkActor2D.h>
#include <vtkTextProperty.h>
#include <vtkTextMapper.h>
#include <sstream>
#include <iostream>
using namespace std;
class StatusMessage
{
public:
static std::string Format(int slice, int maxSlice)
{
std::stringstream tmp;
tmp << "Slice Number " << slice + 1 << "/" << maxSlice + 1;
return tmp.str();
}
};
class myvtkInteractorStyleImage: public vtkInteractorStyleImage
{
public:
static myvtkInteractorStyleImage* New();
vtkTypeMacro(myvtkInteractorStyleImage, vtkInteractorStyleImage);
protected:
vtkImageViewer2* _ImageViewer;
vtkTextMapper* _StatusMapper;
int _Slice;
int _MinSlice;
int _MaxSlice;
public:
void SetImageViewer(vtkImageViewer2* imageViewer) {
_ImageViewer = imageViewer;
_MinSlice = imageViewer->GetSliceMin();
_MaxSlice = imageViewer->GetSliceMax();
_Slice = _MinSlice;
cout << "Slice: Min = " << _MinSlice << ", Max = " << _MaxSlice << endl;
}
void SetStatusMapper(vtkTextMapper* statusMapper)
{
_StatusMapper = statusMapper;
}
protected:
void MoveSliceForward()
{
if (_Slice < _MaxSlice)
{
_Slice += 1;
cout << "MoveSliceForward::Slice = " << _Slice << endl;
_ImageViewer->SetSlice(_Slice);
std::string msg = StatusMessage::Format(_Slice, _MaxSlice);
_StatusMapper->SetInput(msg.c_str());
_ImageViewer->Render();
}
}
void MoveSliceBackward()
{
if (_Slice > _MinSlice)
{
_Slice -= 1;
cout << "MoveSliceBackward::Slice = " << _Slice << endl;
_ImageViewer->SetSlice(_Slice);
std::string msg = StatusMessage::Format(_Slice, _MaxSlice);
_StatusMapper->SetInput(msg.c_str());
_ImageViewer->Render();
}
}
virtual void OnKeyDown()
{
std::string key = this->GetInteractor()->GetKeySym();
if (key.compare("Up") == 0)
MoveSliceForward();
else if (key.compare("Down")==0)
{
MoveSliceBackward();
}
vtkInteractorStyleImage::OnKeyDown();
}
virtual void OnMouseWheelForward()
{
MoveSliceForward();
}
virtual void OnMouseWheelBackward()
{
if (_Slice > _MinSlice)
MoveSliceBackward();
}
};
vtkStandardNewMacro(myvtkInteractorStyleImage);
int main(int argc, char* argv[])
{
std::string folder = "G:\\Dicom\\Dicom File\\dcmFile";
vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
reader->SetDirectoryName(folder.c_str());
reader->Update();
vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
imageViewer->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkTextProperty> sliceTextProp = vtkSmartPointer<vtkTextProperty>::New();
sliceTextProp->SetFontFamilyToCourier();
sliceTextProp->SetFontSize(20);
sliceTextProp->SetVerticalJustificationToBottom();
sliceTextProp->SetJustificationToLeft();
vtkSmartPointer<vtkTextMapper> sliceTextMapper = vtkSmartPointer<vtkTextMapper>::New();
std::string msg = StatusMessage::Format(imageViewer->GetSliceMin(), imageViewer->GetSliceMax());
sliceTextMapper->SetInput(msg.c_str());
sliceTextMapper->SetTextProperty(sliceTextProp);
vtkSmartPointer<vtkActor2D> sliceTextActor = vtkSmartPointer<vtkActor2D>::New();
sliceTextActor->SetMapper(sliceTextMapper);
sliceTextActor->SetPosition(15, 10);
vtkSmartPointer<vtkTextProperty> usageTextProp = vtkSmartPointer<vtkTextProperty>::New();
usageTextProp->SetFontFamilyToCourier();
usageTextProp->SetFontSize(14);
usageTextProp->SetVerticalJustificationToTop();
usageTextProp->SetJustificationToLeft();
vtkSmartPointer<vtkTextMapper> usageTextMapper = vtkSmartPointer<vtkTextMapper>::New();
usageTextMapper->SetInput("- Slice with mouse wheel\n or Up/Down-Key\n- Zoom with pressed right\n mouse button while dragging");
usageTextMapper->SetTextProperty(usageTextProp);
vtkSmartPointer<vtkActor2D> usageTextActor = vtkSmartPointer<vtkActor2D>::New();
usageTextActor->SetMapper(usageTextMapper);
usageTextActor->GetPositionCoordinate()->SetCoordinateSystemToNormalizedDisplay();
usageTextActor->GetPositionCoordinate()->SetValue(0.05, 0.95);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<myvtkInteractorStyleImage> myInteractorStyle =
vtkSmartPointer<myvtkInteractorStyleImage>::New();
myInteractorStyle->SetImageViewer(imageViewer);
myInteractorStyle->SetStatusMapper(sliceTextMapper);
imageViewer->SetupInteractor(renderWindowInteractor);
renderWindowInteractor->SetInteractorStyle(myInteractorStyle);
imageViewer->GetRenderer()->AddActor2D(sliceTextActor);
imageViewer->GetRenderer()->AddActor2D(usageTextActor);
imageViewer->GetRenderWindow()->SetSize(800, 600);
imageViewer->SetColorLevel(100);
imageViewer->SetColorWindow(2000);
imageViewer->Render();
imageViewer->GetRenderer()->ResetCamera();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
上一篇: Matlab - 远程Linux服务器安装 R2014a
下一篇: 第3章 决策树
推荐阅读
-
C#递归实现显示文件夹及所有文件并计算其大小的方法
-
Java实现读取及生成Excel文件的方法
-
Android开发实现读取Assets下文件及文件写入存储卡的方法
-
Android开发实现读取Assets下文件及文件写入存储卡的方法
-
Android实现读取SD卡下所有TXT文件名并用listView显示出来的方法
-
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
-
Python实现读取及写入csv文件的方法示例
-
数据压缩学习实验(三)PNG文件读取及转换至YUV色彩空间的C++实现
-
PHP实现类似于C语言的文件读取及解析功能
-
Android实现读取SD卡下所有TXT文件名并用listView显示出来的方法