使用 VTK 转换 DICOM 图像

Convert DICOM image using VTK

我需要将 DICOM 图像转换为 JPG/PNG 并使用 VTK 保存图像,但我生成的图像与原始图像不匹配。

我知道我需要重新缩放图像的像素以进行转换,但我不知道如何进行。有谁知道我怎样才能正确地进行转换?

下面,我在python中的代码:

from vtk import *

reader = vtkDICOMImageReader()
reader.SetFileName('image.dcm')
reader.Update()

castFilter = vtkImageCast()
castFilter.SetOutputScalarTypeToUnsignedChar()
castFilter.SetInputConnection(reader.GetOutputPort())
castFilter.Update()

writer = vtkJPEGWriter()
writer.SetFileName('output.jpg')
writer.SetInputConnection(castFilter.GetOutputPort())
writer.Write()

MRI 和 CT 模式中的 DICOM 通常是短类型,您正在无情地将图像转换为 unsigned char。 如果你想获得相应的 uchar 图像,你应该使用 vtkImageShiftScale,就像 vtkImageCast 文档说的那样:

Warning As vtkImageCast only casts values without rescaling them, its use is not recommented. vtkImageShiftScale is the recommented way to change the type of an image data.

我进行了转换,这是我的代码:

from vtk import vtkDICOMImageReader
from vtk import vtkImageShiftScale
from vtk import vtkPNGWriter

reader = vtkDICOMImageReader()
reader.SetFileName('image.dcm')
reader.Update()
image = reader.GetOutput()

shiftScaleFilter = vtkImageShiftScale()
shiftScaleFilter.SetOutputScalarTypeToUnsignedChar()
shiftScaleFilter.SetInputConnection(reader.GetOutputPort())

shiftScaleFilter.SetShift(-1.0*image.GetScalarRange()[0])
oldRange = image.GetScalarRange()[1] - image.GetScalarRange()[0]
newRange = 255

shiftScaleFilter.SetScale(newRange/oldRange)
shiftScaleFilter.Update()

writer = vtkPNGWriter()
writer.SetFileName('output.jpg')
writer.SetInputConnection(shiftScaleFilter.GetOutputPort())
writer.Write()