ITK icon indicating copy to clipboard operation
ITK copied to clipboard

CropImageFilter complaints about 0 image size

Open nicktasios opened this issue 3 years ago • 2 comments

Description

When passing a filter output to CropImageFilter I get the following error if I don't update the filter first.

Traceback (most recent call last):                                                                                    
  File "test_mesh_filter.py", line 52, in <module>                                                                    
                                                                                                                      
RuntimeError: /work/ITK-source/ITK/Modules/Filtering/ImageGrid/include/itkCropImageFilter.hxx:76:                     
ITK ERROR: CropImageFilter(0x55a7ea50ac80): The input image's size [0, 0, 0] is less than the total of the crop size! 

Steps to Reproduce

Run the following:

import itk                                                                              
                                                                                        
if __name__ == '__main__':                                                              
    should_pad_and_crop = True                                                          
                                                                                        
    TCoordinate = itk.D                                                                 
    Dimension = 3                                                                       
    TMesh = itk.Mesh[TCoordinate, Dimension].New()                                      
    sphere = itk.RegularSphereMeshSource[TMesh].New()                                   
    sphere.SetResolution(4)                                                             
    sphere_mesh = sphere.GetOutput()                                                    
                                                                                        
    mesh_writer = itk.MeshFileWriter[TMesh].New()                                       
    mesh_writer.SetFileName( "sphere.vtk" )                                             
    mesh_writer.SetInput(sphere_mesh)                                                   
    mesh_writer.Update()                                                                
                                                                                        
    TMesh = itk.Mesh[itk.SS, Dimension].New()                                           
    mesh_reader = itk.MeshFileReader[TMesh].New()                                       
    mesh_reader.SetFileName("sphere.vtk")                                               
    mesh_reader.Update()                                                                
    sphere_mesh = mesh_reader.GetOutput()                                               
                                                                                        
    TPixel = itk.SS                                                                     
    TImage = itk.Image[TPixel, Dimension]                                               
                                                                                        
    image = itk.Image[TPixel, Dimension].New()                                          
    region = itk.ImageRegion[Dimension]()                                               
    region.SetSize([128, 128, 128])                                                     
    region.SetIndex([0, 0, 0])                                                          
    image.SetRegions(region)                                                            
    image.Allocate()                                                                    
    image.SetOrigin([-1.28, -1.28, -1.28])                                              
    image.SetSpacing([0.02, 0.02, 0.02])                                                
                                                                                        
    if should_pad_and_crop:                                                             
        pad_filter = itk.ConstantPadImageFilter[TImage, TImage].New()                   
        pad_filter.SetInput(image)                                                      
        pad_filter.SetPadLowerBound((1,1,1))                                            
        pad_filter.SetPadUpperBound((1,1,1))                                            
                                                                                        
        mesh_to_image_filter = itk.TriangleMeshToBinaryImageFilter[TMesh, TImage].New() 
        mesh_to_image_filter.SetInput(sphere_mesh)                                      
        mesh_to_image_filter.SetInfoImage(pad_filter.GetOutput())                       
        #mesh_to_image_filter.Update()                                                  
                                                                                        
        crop_filter = itk.CropImageFilter[TImage, TImage].New()                         
        crop_filter.SetInput(mesh_to_image_filter.GetOutput())                          
        crop_filter.SetUpperBoundaryCropSize((1,1,1))                                   
        crop_filter.SetLowerBoundaryCropSize((1,1,1))                                   
        crop_filter.Update()                                                            
                                                                                        
        itk.imwrite(crop_filter.GetOutput(), "sphere.nii.gz")                           
    else:                                                                               
        mesh_to_image_filter = itk.TriangleMeshToBinaryImageFilter[TMesh, TImage].New() 
        mesh_to_image_filter.SetInput(sphere_mesh)                                      
        mesh_to_image_filter.SetInfoImage(image)                                        
        mesh_to_image_filter.Update()                                                   
                                                                                        
        itk.imwrite(mesh_to_image_filter.GetOutput(), "sphere.nii.gz")                  

If the Update is uncommented it works fine.

Expected behavior

I should not need to call Update on the filter before passing it as input to CropImageFilter.

Versions

Python ITK '5.2.1'

Environment

Linux Python 3.8.10

nicktasios avatar Nov 19 '21 16:11 nicktasios

My expectation is that this is a bug with TriangleMeshToBinaryImageFilter. VerifyOutputInformation should be called after UpdateOutputInformation. The TriangleMeshToBinaryImageFilter should update it's output's size in UpdateOutputInformation.These error messages seem to indicate that TriangleMeshToBinaryImageFilter did not update its output size and other information.

blowekamp avatar Nov 19 '21 17:11 blowekamp

This issue has been automatically marked as stale because it has not had recent activity. Thank you for your contributions.

stale[bot] avatar Apr 16 '22 10:04 stale[bot]