Пример #1
0
def convert_all():
    # Convert training data
    for idx in range(1, 1 + 4):
        for modality in ['T1', 'T2', 'seg']:
            fname = get_neobrain('train', idx, modality)
            fname_noext = fname[:-4]
            convert_neobrain_to_nifti(fname_noext)

    # Convert testing data
    for idx in range(1, 1 + 3):
        for prefix in ['i1', 'i2', 'i3', 'iC1', 'iC2']:
            for suffix in ['t1', 't2']:
                modality = prefix + '_' + suffix
                fname = get_neobrain('test', idx, modality)
                fname_noext = fname[:-4]
                convert_neobrain_to_nifti(fname_noext)
def convert_all():
    # Convert training data
    for idx in range(1, 1 + 4):
        for modality in ['T1', 'T2', 'seg']:
            fname = get_neobrain('train', idx, modality)
            fname_noext = fname[:-4]
            convert_neobrain_to_nifti(fname_noext)

    # Convert testing data
    for idx in range(1, 1 + 3):
        for prefix in ['i1', 'i2', 'i3', 'iC1', 'iC2']:
            for suffix in ['t1', 't2']:
                modality = prefix + '_' + suffix
                fname = get_neobrain('test', idx, modality)
                fname_noext = fname[:-4]
                convert_neobrain_to_nifti(fname_noext)
Пример #3
0
def align_atlas():
    neo_fname = get_neobrain('train', 1, 'T2')
    neo_nib = nib.load(neo_fname)
    neo = neo_nib.get_data()
    neo_affine = neo_nib.get_affine()

    # Load atlas (with skull)
    atlas_fname = get_neobrain('atlas', 'neo-withSkull', None)
    atlas_nib = nib.load(atlas_fname)
    atlas = atlas_nib.get_data()
    atlas_affine = atlas_nib.get_affine()

    # The first training volume dimensions are about  5cm x 5cm x 8cm
    # The atlas  dimensions are about 7cm x 9cm x 11 cm
    # Assuming isotropic scale, the atlas is about 1.5 times larger than
    # the input image:
    iso_scale = (float(7*9*11)/float(5*5*8))**(1.0/3)
    print(iso_scale)

    #We can use this to constraint the transformation to rigid
    scale = np.eye(4)
    scale[:3,:3] *= iso_scale

    rigid_map_fname = 'atlas_towards_neo1_rigid.p'

    if os.path.isfile(rigid_map_fname):
        rigid_map = pickle.load(open(rigid_map_fname, 'r'))
    else:
        transforms = ['RIGID']
        rigid_map = dipy_align(neo, neo_affine, atlas, atlas_affine,
                         transforms=transforms, prealign=scale)
        pickle.dump(rigid_map, open(rigid_map_fname, 'w'))

    atlas_resampled = rigid_map.transform(atlas)

    # Compare anterior coronal slices
    rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=10, ltitle='Neo1', rtitle='Atlas');
    # Compare middle coronal slices
    rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=25, ltitle='Neo1', rtitle='Atlas');
    # Compare posterior coronal slices
    rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=40, ltitle='Neo1', rtitle='Atlas');

    # Load the peeled atlas
    atlas_wcerebellum_fname = get_neobrain('atlas', 'neo-withCerebellum', None)
    atlas_wcerebellum_nib = nib.load(atlas_wcerebellum_fname)
    atlas_wcerebellum = atlas_wcerebellum_nib.get_data()
    atlas_wcerebellum_affine = atlas_wcerebellum_nib.get_affine()

    # Configure diffeomorphic registration
    diff_map_name = 'atlas_towards_neo1_diff.p'
    if os.path.isfile(diff_map_name):
        diff_map = pickle.load(open(diff_map_name, 'r'))
    else:
        metric = CCMetric(3)
        sdr = SymmetricDiffeomorphicRegistration(metric)
        # The atlases are not aligned in physical space!! use atlas_affine instead of atlas_wcerebellum_affine
        diff_map = sdr.optimize(neo, atlas_wcerebellum, neo_affine, atlas_affine, prealign=rigid_map.affine)
        pickle.dump(diff_map, open(diff_map_name, 'w'))

    atlas_wcerebellum_deformed = diff_map.transform(atlas_wcerebellum)

    # Before and after diffeomorphic registration
    rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=10, ltitle='Neo1', rtitle='Atlas');
    rt.overlay_slices(neo, atlas_wcerebellum_deformed, slice_type=2, slice_index=10, ltitle='Neo1', rtitle='Atlas');
    # Before and after diffeomorphic registration
    rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=25, ltitle='Neo1', rtitle='Atlas');
    rt.overlay_slices(neo, atlas_wcerebellum_deformed, slice_type=2, slice_index=25, ltitle='Neo1', rtitle='Atlas');
    # Before and after diffeomorphic registration
    rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=40, ltitle='Neo1', rtitle='Atlas');
    rt.overlay_slices(neo, atlas_wcerebellum_deformed, slice_type=2, slice_index=40, ltitle='Neo1', rtitle='Atlas');
    
    
    
    
    # Now all volumes
    atlas_fname = get_neobrain('atlas', 'neo-withSkull', None)
    atlas_nib = nib.load(atlas_fname)
    atlas = atlas_nib.get_data()
    atlas_affine = atlas_nib.get_affine()
    
    atlas_wcerebellum_fname = get_neobrain('atlas', 'neo-withCerebellum', None)
    atlas_wcerebellum_nib = nib.load(atlas_wcerebellum_fname)
    atlas_wcerebellum = atlas_wcerebellum_nib.get_data()
    atlas_wcerebellum_affine = atlas_wcerebellum_nib.get_affine()
    
    
    
    
    
    idx = 2
    neoi_fname = get_neobrain('train', idx, 'T2')
    neoi_nib = nib.load(neoi_fname)
    neoi = neoi_nib.get_data()
    neoi_affine = neoi_nib.get_affine()
    
    iso_scale = (float(7*9*11)/float(5*5*8))**(1.0/3)
    print(iso_scale)
    

    #We can use this to constraint the transformation to rigid
    scale = np.eye(4)
    scale[:3,:3] *= iso_scale

    rigid_map_fname = 'atlas_towards_neo%d_affine.p'%(idx,)

    if os.path.isfile(rigid_map_fname):
        rigid_map = pickle.load(open(rigid_map_fname, 'r'))
    else:
        transforms = ['RIGID', 'AFFINE']
        level_iters = [[10000, 1000, 100], [100]]
        rigid_map = dipy_align(neoi, neoi_affine, atlas, atlas_affine,
                               transforms=transforms,
                               level_iters=level_iters,
                               prealign=scale)
        pickle.dump(rigid_map, open(rigid_map_fname, 'w'))

    atlas_resampled = rigid_map.transform(atlas)
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index = 6)
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index = 10)
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index = 25)
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index = 40)
    
    diff_map_name = 'atlas_towards_neo%d_diff.p'%(idx,)
    if os.path.isfile(diff_map_name):
        diff_map = pickle.load(open(diff_map_name, 'r'))
    else:
        metric = CCMetric(3)
        sdr = SymmetricDiffeomorphicRegistration(metric)
        # The atlases are not aligned in physical space!! use atlas_affine instead of atlas_wcerebellum_affine
        diff_map = sdr.optimize(neoi, atlas_wcerebellum, neoi_affine, atlas_affine, prealign=rigid_map.affine)
        pickle.dump(diff_map, open(diff_map_name, 'w'))

    atlas_wcerebellum_deformed = diff_map.transform(atlas_wcerebellum)

    # Before and after diffeomorphic registration
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=6, ltitle='Neo%d'%(idx,), rtitle='Atlas');
    rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=6, ltitle='Neo%d'%(idx,), rtitle='Atlas');
    
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=10, ltitle='Neo%d'%(idx,), rtitle='Atlas');
    rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=10, ltitle='Neo%d'%(idx,), rtitle='Atlas');
    # Before and after diffeomorphic registration
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=25, ltitle='Neo%d'%(idx,), rtitle='Atlas');
    rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=25, ltitle='Neo%d'%(idx,), rtitle='Atlas');
    # Before and after diffeomorphic registration
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=40, ltitle='Neo%d'%(idx,), rtitle='Atlas');
    rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=40, ltitle='Neo%d'%(idx,), rtitle='Atlas');
Пример #4
0
def quick_check():

    img1_fname = "/home/omar/data/DATA_NeoBrainS12/T1.nii.gz"
    img2_fname = "/home/omar/data/DATA_NeoBrainS12/set2_i1_t1.nii.gz"

    img1_nib = nib.load(img1_fname)
    img1 = img1_nib.get_data().squeeze()
    img1_affine = img1_nib.get_affine()

    img2_nib = nib.load(img2_fname)
    img2 = img2_nib.get_data().squeeze()
    img2_affine = img2_nib.get_affine()
    # nib.aff2axcodes(img1_affine)
    #aff = AffineMap(None, img1.shape, img1_affine, img2.shape, img2_affine)
    #aff = transform_centers_of_mass(img1, img1_affine, img2, img2_affine)
    aff = dipy_align(img1, img1_affine, img2, img2_affine, np.eye(4))

    img2_resampled = aff.transform(img2)
    rt.overlay_slices(img1, img2_resampled, slice_type=0)
    rt.overlay_slices(img1, img2_resampled, slice_type=1)
    rt.overlay_slices(img1, img2_resampled, slice_type=2)



    # Verify that original and RAS versions of neo1 describe the same object

    # Load original data
    neo1_fname = get_neobrain('train', 1, 'T1')
    neo1_old, neo1_old_affine, neo1_old_spacing, neo1_old_ori = load_from_raw(neo1_fname)

    # Load RAS version
    neo1_nib = nib.load(neo1_fname)
    neo1 = neo1_nib.get_data()
    neo1_affine = neo1_nib.get_affine()

    # Resample RAS on top of original
    aff = AffineMap(None, neo1_old.shape, neo1_old_affine, neo1.shape, neo1_affine)
    neo1_resampled = aff.transform(neo1)
    rt.overlay_slices(neo1_old, neo1_resampled, slice_type=0)
    rt.overlay_slices(neo1_old, neo1_resampled, slice_type=1)
    rt.overlay_slices(neo1_old, neo1_resampled, slice_type=2)


    # Attempt to resample a test volume on top of training
    neo2_fname = get_neobrain('test', 1, 'i1_t1')
    neo2_nib = nib.load(neo2_fname)
    neo2 = neo2_nib.get_data()
    neo2_affine = neo2_nib.get_affine()
    aff = transform_centers_of_mass(neo1, neo1_affine, neo2, neo2_affine)
    #aff = dipy_align(neo1, neo1_affine, neo2, neo2_affine)
    neo2_resampled = aff.transform(neo2)

    rt.overlay_slices(neo1, neo2_resampled, slice_type=0)
    rt.overlay_slices(neo1, neo2_resampled, slice_type=1)
    rt.overlay_slices(neo1, neo2_resampled, slice_type=2)



    # Load atlas
    atlas_fname = get_neobrain('atlas', 'neo-withSkull', None)
    atlas_nib = nib.load(atlas_fname)
    atlas_affine = atlas_nib.get_affine()
    atlas = atlas_nib.get_data()
    rt.plot_slices(atlas)

    # Resample atlas on top of neo1
    aff = AffineMap(None, neo1.shape, neo1_affine, atlas.shape, atlas_affine)
    atlas_resampled = aff.transform(atlas)
    rt.overlay_slices(neo1, atlas_resampled)
def align_atlas():
    neo_fname = get_neobrain('train', 1, 'T2')
    neo_nib = nib.load(neo_fname)
    neo = neo_nib.get_data()
    neo_affine = neo_nib.get_affine()

    # Load atlas (with skull)
    atlas_fname = get_neobrain('atlas', 'neo-withSkull', None)
    atlas_nib = nib.load(atlas_fname)
    atlas = atlas_nib.get_data()
    atlas_affine = atlas_nib.get_affine()

    # The first training volume dimensions are about  5cm x 5cm x 8cm
    # The atlas  dimensions are about 7cm x 9cm x 11 cm
    # Assuming isotropic scale, the atlas is about 1.5 times larger than
    # the input image:
    iso_scale = (float(7 * 9 * 11) / float(5 * 5 * 8))**(1.0 / 3)
    print(iso_scale)

    #We can use this to constraint the transformation to rigid
    scale = np.eye(4)
    scale[:3, :3] *= iso_scale

    rigid_map_fname = 'atlas_towards_neo1_rigid.p'

    if os.path.isfile(rigid_map_fname):
        rigid_map = pickle.load(open(rigid_map_fname, 'r'))
    else:
        transforms = ['RIGID']
        rigid_map = dipy_align(neo,
                               neo_affine,
                               atlas,
                               atlas_affine,
                               transforms=transforms,
                               prealign=scale)
        pickle.dump(rigid_map, open(rigid_map_fname, 'w'))

    atlas_resampled = rigid_map.transform(atlas)

    # Compare anterior coronal slices
    rt.overlay_slices(neo,
                      atlas_resampled,
                      slice_type=2,
                      slice_index=10,
                      ltitle='Neo1',
                      rtitle='Atlas')
    # Compare middle coronal slices
    rt.overlay_slices(neo,
                      atlas_resampled,
                      slice_type=2,
                      slice_index=25,
                      ltitle='Neo1',
                      rtitle='Atlas')
    # Compare posterior coronal slices
    rt.overlay_slices(neo,
                      atlas_resampled,
                      slice_type=2,
                      slice_index=40,
                      ltitle='Neo1',
                      rtitle='Atlas')

    # Load the peeled atlas
    atlas_wcerebellum_fname = get_neobrain('atlas', 'neo-withCerebellum', None)
    atlas_wcerebellum_nib = nib.load(atlas_wcerebellum_fname)
    atlas_wcerebellum = atlas_wcerebellum_nib.get_data()
    atlas_wcerebellum_affine = atlas_wcerebellum_nib.get_affine()

    # Configure diffeomorphic registration
    diff_map_name = 'atlas_towards_neo1_diff.p'
    if os.path.isfile(diff_map_name):
        diff_map = pickle.load(open(diff_map_name, 'r'))
    else:
        metric = CCMetric(3)
        sdr = SymmetricDiffeomorphicRegistration(metric)
        # The atlases are not aligned in physical space!! use atlas_affine instead of atlas_wcerebellum_affine
        diff_map = sdr.optimize(neo,
                                atlas_wcerebellum,
                                neo_affine,
                                atlas_affine,
                                prealign=rigid_map.affine)
        pickle.dump(diff_map, open(diff_map_name, 'w'))

    atlas_wcerebellum_deformed = diff_map.transform(atlas_wcerebellum)

    # Before and after diffeomorphic registration
    rt.overlay_slices(neo,
                      atlas_resampled,
                      slice_type=2,
                      slice_index=10,
                      ltitle='Neo1',
                      rtitle='Atlas')
    rt.overlay_slices(neo,
                      atlas_wcerebellum_deformed,
                      slice_type=2,
                      slice_index=10,
                      ltitle='Neo1',
                      rtitle='Atlas')
    # Before and after diffeomorphic registration
    rt.overlay_slices(neo,
                      atlas_resampled,
                      slice_type=2,
                      slice_index=25,
                      ltitle='Neo1',
                      rtitle='Atlas')
    rt.overlay_slices(neo,
                      atlas_wcerebellum_deformed,
                      slice_type=2,
                      slice_index=25,
                      ltitle='Neo1',
                      rtitle='Atlas')
    # Before and after diffeomorphic registration
    rt.overlay_slices(neo,
                      atlas_resampled,
                      slice_type=2,
                      slice_index=40,
                      ltitle='Neo1',
                      rtitle='Atlas')
    rt.overlay_slices(neo,
                      atlas_wcerebellum_deformed,
                      slice_type=2,
                      slice_index=40,
                      ltitle='Neo1',
                      rtitle='Atlas')

    # Now all volumes
    atlas_fname = get_neobrain('atlas', 'neo-withSkull', None)
    atlas_nib = nib.load(atlas_fname)
    atlas = atlas_nib.get_data()
    atlas_affine = atlas_nib.get_affine()

    atlas_wcerebellum_fname = get_neobrain('atlas', 'neo-withCerebellum', None)
    atlas_wcerebellum_nib = nib.load(atlas_wcerebellum_fname)
    atlas_wcerebellum = atlas_wcerebellum_nib.get_data()
    atlas_wcerebellum_affine = atlas_wcerebellum_nib.get_affine()

    idx = 2
    neoi_fname = get_neobrain('train', idx, 'T2')
    neoi_nib = nib.load(neoi_fname)
    neoi = neoi_nib.get_data()
    neoi_affine = neoi_nib.get_affine()

    iso_scale = (float(7 * 9 * 11) / float(5 * 5 * 8))**(1.0 / 3)
    print(iso_scale)

    #We can use this to constraint the transformation to rigid
    scale = np.eye(4)
    scale[:3, :3] *= iso_scale

    rigid_map_fname = 'atlas_towards_neo%d_affine.p' % (idx, )

    if os.path.isfile(rigid_map_fname):
        rigid_map = pickle.load(open(rigid_map_fname, 'r'))
    else:
        transforms = ['RIGID', 'AFFINE']
        level_iters = [[10000, 1000, 100], [100]]
        rigid_map = dipy_align(neoi,
                               neoi_affine,
                               atlas,
                               atlas_affine,
                               transforms=transforms,
                               level_iters=level_iters,
                               prealign=scale)
        pickle.dump(rigid_map, open(rigid_map_fname, 'w'))

    atlas_resampled = rigid_map.transform(atlas)
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=6)
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=10)
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=25)
    rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=40)

    diff_map_name = 'atlas_towards_neo%d_diff.p' % (idx, )
    if os.path.isfile(diff_map_name):
        diff_map = pickle.load(open(diff_map_name, 'r'))
    else:
        metric = CCMetric(3)
        sdr = SymmetricDiffeomorphicRegistration(metric)
        # The atlases are not aligned in physical space!! use atlas_affine instead of atlas_wcerebellum_affine
        diff_map = sdr.optimize(neoi,
                                atlas_wcerebellum,
                                neoi_affine,
                                atlas_affine,
                                prealign=rigid_map.affine)
        pickle.dump(diff_map, open(diff_map_name, 'w'))

    atlas_wcerebellum_deformed = diff_map.transform(atlas_wcerebellum)

    # Before and after diffeomorphic registration
    rt.overlay_slices(neoi,
                      atlas_resampled,
                      slice_type=2,
                      slice_index=6,
                      ltitle='Neo%d' % (idx, ),
                      rtitle='Atlas')
    rt.overlay_slices(neoi,
                      atlas_wcerebellum_deformed,
                      slice_type=2,
                      slice_index=6,
                      ltitle='Neo%d' % (idx, ),
                      rtitle='Atlas')

    rt.overlay_slices(neoi,
                      atlas_resampled,
                      slice_type=2,
                      slice_index=10,
                      ltitle='Neo%d' % (idx, ),
                      rtitle='Atlas')
    rt.overlay_slices(neoi,
                      atlas_wcerebellum_deformed,
                      slice_type=2,
                      slice_index=10,
                      ltitle='Neo%d' % (idx, ),
                      rtitle='Atlas')
    # Before and after diffeomorphic registration
    rt.overlay_slices(neoi,
                      atlas_resampled,
                      slice_type=2,
                      slice_index=25,
                      ltitle='Neo%d' % (idx, ),
                      rtitle='Atlas')
    rt.overlay_slices(neoi,
                      atlas_wcerebellum_deformed,
                      slice_type=2,
                      slice_index=25,
                      ltitle='Neo%d' % (idx, ),
                      rtitle='Atlas')
    # Before and after diffeomorphic registration
    rt.overlay_slices(neoi,
                      atlas_resampled,
                      slice_type=2,
                      slice_index=40,
                      ltitle='Neo%d' % (idx, ),
                      rtitle='Atlas')
    rt.overlay_slices(neoi,
                      atlas_wcerebellum_deformed,
                      slice_type=2,
                      slice_index=40,
                      ltitle='Neo%d' % (idx, ),
                      rtitle='Atlas')
def quick_check():

    img1_fname = "/home/omar/data/DATA_NeoBrainS12/T1.nii.gz"
    img2_fname = "/home/omar/data/DATA_NeoBrainS12/set2_i1_t1.nii.gz"

    img1_nib = nib.load(img1_fname)
    img1 = img1_nib.get_data().squeeze()
    img1_affine = img1_nib.get_affine()

    img2_nib = nib.load(img2_fname)
    img2 = img2_nib.get_data().squeeze()
    img2_affine = img2_nib.get_affine()
    # nib.aff2axcodes(img1_affine)
    #aff = AffineMap(None, img1.shape, img1_affine, img2.shape, img2_affine)
    #aff = transform_centers_of_mass(img1, img1_affine, img2, img2_affine)
    aff = dipy_align(img1, img1_affine, img2, img2_affine, np.eye(4))

    img2_resampled = aff.transform(img2)
    rt.overlay_slices(img1, img2_resampled, slice_type=0)
    rt.overlay_slices(img1, img2_resampled, slice_type=1)
    rt.overlay_slices(img1, img2_resampled, slice_type=2)

    # Verify that original and RAS versions of neo1 describe the same object

    # Load original data
    neo1_fname = get_neobrain('train', 1, 'T1')
    neo1_old, neo1_old_affine, neo1_old_spacing, neo1_old_ori = load_from_raw(
        neo1_fname)

    # Load RAS version
    neo1_nib = nib.load(neo1_fname)
    neo1 = neo1_nib.get_data()
    neo1_affine = neo1_nib.get_affine()

    # Resample RAS on top of original
    aff = AffineMap(None, neo1_old.shape, neo1_old_affine, neo1.shape,
                    neo1_affine)
    neo1_resampled = aff.transform(neo1)
    rt.overlay_slices(neo1_old, neo1_resampled, slice_type=0)
    rt.overlay_slices(neo1_old, neo1_resampled, slice_type=1)
    rt.overlay_slices(neo1_old, neo1_resampled, slice_type=2)

    # Attempt to resample a test volume on top of training
    neo2_fname = get_neobrain('test', 1, 'i1_t1')
    neo2_nib = nib.load(neo2_fname)
    neo2 = neo2_nib.get_data()
    neo2_affine = neo2_nib.get_affine()
    aff = transform_centers_of_mass(neo1, neo1_affine, neo2, neo2_affine)
    #aff = dipy_align(neo1, neo1_affine, neo2, neo2_affine)
    neo2_resampled = aff.transform(neo2)

    rt.overlay_slices(neo1, neo2_resampled, slice_type=0)
    rt.overlay_slices(neo1, neo2_resampled, slice_type=1)
    rt.overlay_slices(neo1, neo2_resampled, slice_type=2)

    # Load atlas
    atlas_fname = get_neobrain('atlas', 'neo-withSkull', None)
    atlas_nib = nib.load(atlas_fname)
    atlas_affine = atlas_nib.get_affine()
    atlas = atlas_nib.get_data()
    rt.plot_slices(atlas)

    # Resample atlas on top of neo1
    aff = AffineMap(None, neo1.shape, neo1_affine, atlas.shape, atlas_affine)
    atlas_resampled = aff.transform(atlas)
    rt.overlay_slices(neo1, atlas_resampled)