我正在尝试使用ITK的GeodesicActiveContourLevelSetImageFilter分割图像中的对象。我的代码与https://itk.org/ITKExamples/src/Segmentation/LevelSets/SegmentWithGeodesicActiveContourLevelSet/Documentation.html中的示例几乎相同,但出现以下错误:
RuntimeError: c:\p\ipp\standalone-build\itk-source\modules\core\common\include\itkImageToImageFilter.hxx:241:
itk::ERROR: GeodesicActiveContourLevelSetImageFilter(000002189D4F4460):
Inputs do not occupy the same physical space!
InputImage Direction: -1.0000000e+00 0.0000000e+00 0.0000000e+00
0.0000000e+00 -1.0000000e+00 0.0000000e+00
0.0000000e+00 0.0000000e+00 -1.0000000e+00,
InputImageInitialImage Direction: 1.0000000e+00 0.0000000e+00 0.0000000e+00
0.0000000e+00 1.0000000e+00 0.0000000e+00
0.0000000e+00 0.0000000e+00 1.0000000e+00
Tolerance: 1.0000000e-06
似乎(NifTi)图像的方向在CurvatureAnisotropicDiffusionImageFilter之后发生了变化-由于某些原因,我认为它在此阶段已镜像。该错误是在“ writer.Update()”处触发的(请参阅下面的代码)。
这是我第一次在ITK工作,感谢您的帮助。
initialDistance = 0.0
sigma = 0.5
alpha = -0.3
beta = 2.0
propagationScaling = 10.0
numberOfIterations = 400
seedValue = -initialDistance
Dimension = 3
InputPixelType = itk.F
OutputPixelType = itk.UC
InputImageType = itk.Image[InputPixelType, Dimension]
OutputImageType = itk.Image[OutputPixelType, Dimension]
ReaderType = itk.ImageFileReader[InputImageType]
WriterType = itk.ImageFileWriter[OutputImageType]
reader = ReaderType.New()
reader.SetFileName(inputFileName)
SmoothingFilterType = itk.CurvatureAnisotropicDiffusionImageFilter[InputImageType, InputImageType]
smoothing = SmoothingFilterType.New()
smoothing.SetTimeStep(0.0625)
smoothing.SetNumberOfIterations(5)
smoothing.SetConductanceParameter(1.5)
smoothing.SetInput(reader.GetOutput())
GradientFilterType = itk.GradientMagnitudeRecursiveGaussianImageFilter[InputImageType, InputImageType]
gradientMagnitude = GradientFilterType.New()
gradientMagnitude.SetSigma(sigma)
gradientMagnitude.SetInput(smoothing.GetOutput())
SigmoidFilterType = itk.SigmoidImageFilter[InputImageType, InputImageType]
sigmoid = SigmoidFilterType.New()
sigmoid.SetOutputMinimum(0.0)
sigmoid.SetOutputMaximum(1.0)
sigmoid.SetAlpha(alpha)
sigmoid.SetBeta(beta)
sigmoid.SetInput(gradientMagnitude.GetOutput())
FastMarchingFilterType = itk.FastMarchingImageFilter[InputImageType, InputImageType]
fastMarching = FastMarchingFilterType.New()
GeoActiveContourFilterType = itk.GeodesicActiveContourLevelSetImageFilter[InputImageType, InputImageType, InputPixelType]
geodesicActiveContour = GeoActiveContourFilterType.New()
geodesicActiveContour.SetPropagationScaling(propagationScaling)
geodesicActiveContour.SetCurvatureScaling(1.0)
geodesicActiveContour.SetAdvectionScaling(1.0)
geodesicActiveContour.SetMaximumRMSError(0.02)
geodesicActiveContour.SetNumberOfIterations(numberOfIterations)
geodesicActiveContour.SetInput(fastMarching.GetOutput())
geodesicActiveContour.SetFeatureImage(sigmoid.GetOutput())
ThresholdingFilterType = itk.BinaryThresholdImageFilter[InputImageType, OutputImageType]
thresholder = ThresholdingFilterType.New()
thresholder.SetLowerThreshold(-1000.0)
thresholder.SetUpperThreshold(0.0)
thresholder.SetOutsideValue(itk.NumericTraits[OutputPixelType].min())
thresholder.SetInsideValue(itk.NumericTraits[OutputPixelType].max())
thresholder.SetInput(geodesicActiveContour.GetOutput())
seeds = itk.VectorContainer[itk.UI, itk.LevelSetNode[InputPixelType, Dimension]].New()
seeds.Initialize()
for i in range(len(seedsCoords[0])): # seedCoords are supplied from another func in the form of ([x coordinates], [y coordinates], [z coordinates])
seedPosition = itk.Index[Dimension]()
seedPosition[0] = int(seedsCoords[0][i])
seedPosition[1] = int(seedsCoords[1][i])
seedPosition[2] = int(seedsCoords[2][i])
node = itk.LevelSetNode[InputPixelType, Dimension]()
node.SetValue(seedValue)
node.SetIndex(seedPosition)
seeds.InsertElement(0, node)
fastMarching.SetTrialPoints(seeds)
fastMarching.SetSpeedConstant(1.0)
CastFilterType = itk.RescaleIntensityImageFilter[InputImageType, OutputImageType]
caster1 = CastFilterType.New()
caster2 = CastFilterType.New()
caster3 = CastFilterType.New()
caster4 = CastFilterType.New()
#
writer1 = WriterType.New()
writer2 = WriterType.New()
writer3 = WriterType.New()
writer4 = WriterType.New()
caster1.SetInput(smoothing.GetOutput())
writer1.SetInput(caster1.GetOutput())
writer1.SetFileName("GeodesicActiveContourImageFilterOutput1.png")
caster1.SetOutputMinimum(itk.NumericTraits[OutputPixelType].min())
caster1.SetOutputMaximum(itk.NumericTraits[OutputPixelType].max())
writer1.Update()
caster2.SetInput(gradientMagnitude.GetOutput())
writer2.SetInput(caster2.GetOutput())
writer2.SetFileName("GeodesicActiveContourImageFilterOutput2.png")
caster2.SetOutputMinimum(itk.NumericTraits[OutputPixelType].min())
caster2.SetOutputMaximum(itk.NumericTraits[OutputPixelType].max())
writer2.Update()
caster3.SetInput(sigmoid.GetOutput())
writer3.SetInput(caster3.GetOutput())
writer3.SetFileName("GeodesicActiveContourImageFilterOutput3.png")
caster3.SetOutputMinimum(itk.NumericTraits[OutputPixelType].min())
caster3.SetOutputMaximum(itk.NumericTraits[OutputPixelType].max())
writer3.Update()
caster4.SetInput(fastMarching.GetOutput())
writer4.SetInput(caster4.GetOutput())
writer4.SetFileName("GeodesicActiveContourImageFilterOutput4.png")
caster4.SetOutputMinimum(itk.NumericTraits[OutputPixelType].min())
caster4.SetOutputMaximum(itk.NumericTraits[OutputPixelType].max())
fastMarching.SetOutputSize(reader.GetOutput().GetBufferedRegion().GetSize())
writer = WriterType.New()
writer.SetFileName(outputFileName)
writer.SetInput(thresholder.GetOutput())
writer.Update() # triggers the error
print(
"Max. no. iterations: " +
str(geodesicActiveContour.GetNumberOfIterations()) + "\n")
print(
"Max. RMS error: " +
str(geodesicActiveContour.GetMaximumRMSError()) + "\n")
print(
"No. elpased iterations: " +
str(geodesicActiveContour.GetElapsedIterations()) + "\n")
print("RMS change: " + str(geodesicActiveContour.GetRMSChange()) + "\n")
writer4.Update()
InternalWriterType = itk.ImageFileWriter[InputImageType]
mapWriter = InternalWriterType.New()
mapWriter.SetInput(fastMarching.GetOutput())
mapWriter.SetFileName("GeodesicActiveContourImageFilterOutput4.mha")
mapWriter.Update()
speedWriter = InternalWriterType.New()
speedWriter.SetInput(sigmoid.GetOutput())
speedWriter.SetFileName("GeodesicActiveContourImageFilterOutput3.mha")
speedWriter.Update()
gradientWriter = InternalWriterType.New()
gradientWriter.SetInput(gradientMagnitude.GetOutput())
gradientWriter.SetFileName("GeodesicActiveContourImageFilterOutput2.mha")
gradientWriter.Update()
答案 0 :(得分:0)
您正在使用哪个版本的ITK?您是否尝试过最新的稳定版本(4.13.1)或最新的发行版?
未修改的示例是否会出现问题?如果不是这样,比较差异应该可以找到解决方案。
如果这些都不能解决问题,您可以共享输入图像吗?或者更好的是,显示了问题的输入图像裁剪了吗?