Пример #1
0
 def apply( self, img, target_header=None,
            interpolation='linear', gaussian_parameter=1.0 ):
     """
     Apply.
     """
     if not isinstance( img, irtk.Image ):
         # point transformation
         pt = np.array(img, dtype='float64', copy=True)
         if len(pt.shape) == 1:
             tmp_pt = np.hstack((pt,[1])).astype('float64')
             return np.dot( self.matrix(), tmp_pt )[:3]
         else:
             pt = _irtk.transform_points( self.matrix(), pt )
             return pt  
             # tmp_pt = np.hstack((pt,[[1]]*pt.shape[0])).astype('float64')
             # return np.transpose( np.dot( self.matrix(),
             #                              np.transpose(tmp_pt) ) )[:,:3]
     
     # if target_header is None:
     #     target_header = img.get_header()
     if target_header is None:
         (x_min, y_min, z_min, x_max, y_max, z_max ) = img.bbox(world=True)
         corners = [[x_min, y_min, z_min],
                    [x_max, y_min, z_min],
                    [x_min, y_max, z_min],
                    [x_min, y_min, z_max],
                    [x_max, y_max, z_min],
                    [x_min, y_max, z_max],
                    [x_max, y_min, z_max],
                    [x_max, y_max, z_max]]
         corners = self.apply( corners )
         x_min, y_min, z_min = corners.min(axis=0)
         x_max, y_max, z_max = corners.max(axis=0)
         res = img.header['pixelSize'][0]
         pixelSize = [res, res, res, 1]
         origin = [ x_min + (x_max+1 - x_min)/2,
                    y_min + (y_max+1 - y_min)/2,
                    z_min + (z_max+1 - z_min)/2,
                    img.header['origin'][3] ]
         dim = [ (x_max+1 - x_min)/res,
                 (y_max+1 - y_min)/res,
                 (z_max+1 - z_min)/res,
                 1 ]
         target_header = irtk.new_header( pixelSize=pixelSize, origin=origin, dim=dim)
     if isinstance( target_header, irtk.Image ):
         target_header = target_header.get_header()
     data = img.get_data('float32','cython')
     new_data = _irtk.transform_rigid( self.tx, self.ty, self.tz,
                                       self.rx, self.ry, self.rz,
                                       data,
                                       img.get_header(),
                                       target_header,
                                       interpolation,
                                       gaussian_parameter )
     return irtk.Image( new_data, target_header )
Пример #2
0
 def apply( self, img, target_header=None,
            interpolation='linear', gaussian_parameter=1.0 ):
     """
     Apply.
     """
     if not isinstance( img, irtk.Image ):
         # point transformation
         pt = np.array(img, dtype='float64', copy=True)
         if len(pt.shape) == 1:
             tmp_pt = np.hstack((pt,[1])).astype('float64')
             return np.dot( self.matrix(), tmp_pt )[:3]
         else:
             pt = _irtk.transform_points( self.matrix(), pt )
             return pt  
             # tmp_pt = np.hstack((pt,[[1]]*pt.shape[0])).astype('float64')
             # return np.transpose( np.dot( self.matrix(),
             #                              np.transpose(tmp_pt) ) )[:,:3]
     
     # if target_header is None:
     #     target_header = img.get_header()
     if target_header is None:
         (x_min, y_min, z_min, x_max, y_max, z_max ) = img.bbox(world=True)
         corners = [[x_min, y_min, z_min],
                    [x_max, y_min, z_min],
                    [x_min, y_max, z_min],
                    [x_min, y_min, z_max],
                    [x_max, y_max, z_min],
                    [x_min, y_max, z_max],
                    [x_max, y_min, z_max],
                    [x_max, y_max, z_max]]
         corners = self.apply( corners )
         x_min, y_min, z_min = corners.min(axis=0)
         x_max, y_max, z_max = corners.max(axis=0)
         res = img.header['pixelSize'][0]
         pixelSize = [res, res, res, 1]
         origin = [ x_min + (x_max+1 - x_min)/2,
                    y_min + (y_max+1 - y_min)/2,
                    z_min + (z_max+1 - z_min)/2,
                    img.header['origin'][3] ]
         dim = [ (x_max+1 - x_min)/res,
                 (y_max+1 - y_min)/res,
                 (z_max+1 - z_min)/res,
                 1 ]
         target_header = irtk.new_header( pixelSize=pixelSize, origin=origin, dim=dim)
     if isinstance( target_header, irtk.Image ):
         target_header = target_header.get_header()
     data = img.get_data('float32','cython')
     new_data = _irtk.transform_rigid( self.tx, self.ty, self.tz,
                                       self.rx, self.ry, self.rz,
                                       data,
                                       img.get_header(),
                                       target_header,
                                       interpolation,
                                       gaussian_parameter )
     return irtk.Image( new_data, target_header )
def create_mask_from_all_masks(f_lists,transformations,ga,resolution=0.75):
    points = []
    for f, t in zip(f_lists,transformations):
        m = irtk.imread(f,force_neurological=True)
        points.extend( t.apply(get_corners(m)) )

    points = np.array(points,dtype='float64')
    
    x_min, y_min, z_min = points.min(axis=0)
    x_max, y_max, z_max = points.max(axis=0)

    pixelSize = [resolution, resolution, resolution, 1]
    orientation = np.eye( 3, dtype='float64' )
    origin = [ x_min + (x_max - x_min)/2,
               y_min + (y_max - y_min)/2,
               z_min + (z_max - z_min)/2,
               0 ]
    dim = [ (x_max - x_min)/resolution,
            (y_max - y_min)/resolution,
            (z_max - z_min)/resolution,
            1 ]

    header = irtk.new_header( pixelSize=pixelSize,
                orientation=orientation,
                origin=origin,
                dim=dim )

    mask = irtk.zeros( header, dtype='float32' )

    for f, t in zip( f_lists, transformations ):
        m = irtk.imread(f,force_neurological=True).transform(t, target=mask,interpolation="linear")
        mask += m

    irtk.imwrite( "debug_mask1.nii.gz", mask)
    
    mask = irtk.Image( nd.gaussian_filter( mask, 0.5 ),
                       mask.get_header() )

    irtk.imwrite( "debug_mask2.nii.gz", mask)

    mask = (mask > 0).bbox(crop=True).astype('uint8')

    scale = get_CRL(ga)/get_CRL(30.0)
    template = irtk.imread(f_template,force_neurological=True)
    template.header['pixelSize'][:3] /= scale
    
    template = template.transform(target=mask,interpolation='nearest')
    mask[template==0] = 0

    irtk.imwrite( "debug_template.nii.gz", template)
    irtk.imwrite( "debug_mask3.nii.gz", mask)

    return mask
Пример #4
0
def world_align(img,pixelSize=[3,3,3,1],interpolation='linear'):
    x_min, y_min, z_min, x_max, y_max, z_max = img.wbox()
    
    x0 = ( x_min + x_max ) / 2
    y0 = ( y_min + y_max ) / 2
    z0 = ( z_min + z_max ) / 2
    dx = int((x_max-x_min)/pixelSize[0])
    dy = int((y_max-y_min)/pixelSize[1])
    dz = int((z_max-z_min)/pixelSize[2])
    header = irtk.new_header( pixelSize=pixelSize,
                              orientation=np.eye( 3, dtype='float64' ),
                              origin=[x0,y0,z0,0],
                              dim=[dx,dy,dz,1])

    res = img.transform(target=header,interpolation=interpolation)
    return res.bbox(crop=True)