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
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)