使用 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()
我需要将 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()