Ejemplo n.º 1
0
def image_to_compressed_patches(image,mask,patchsize,subsampling):
  data=image.get_data()
  data = data.reshape(data.shape[0:3])
  p = mp.array_to_patches(data,patch_shape=(patchsize,patchsize,patchsize),normalization=True)
  
  data = mask.get_data().astype(bool)
  data = data.reshape(data.shape[0:3])
  pm = mp.array_to_patches(data,patch_shape=(patchsize,patchsize,patchsize),normalization=False)
  
  #Remove zero patches
  pmr = p[ ~np.all(pm==0,axis=1) ]
  del p,pm

  #Subsampling of the data
  np.random.shuffle(pmr)
  pmr = pmr[0:np.int(subsampling*pmr.shape[0]),:].astype(float)
  
  return pmr  
Ejemplo n.º 2
0
def image_to_compressed_patches(image, mask, patchsize, subsampling):
    data = image.get_data()
    data = data.reshape(data.shape[0:3])
    p = mp.array_to_patches(data,
                            patch_shape=(patchsize, patchsize, patchsize),
                            normalization=True)

    data = mask.get_data().astype(bool)
    data = data.reshape(data.shape[0:3])
    pm = mp.array_to_patches(data,
                             patch_shape=(patchsize, patchsize, patchsize),
                             normalization=False)

    #Remove zero patches
    pmr = p[~np.all(pm == 0, axis=1)]
    del p, pm

    #Subsampling of the data
    np.random.shuffle(pmr)
    pmr = pmr[0:np.int(subsampling * pmr.shape[0]), :].astype(float)

    return pmr
Ejemplo n.º 3
0
def scskl_reconstruction(data, mask, D):
    output = np.zeros(data.shape)
    fmap = np.zeros((D.shape[0]))
    #fdata = np.zeros((data.shape[0],data.shape[1],data.shape[2],D.shape[0]))

    px = np.int(np.around(np.power(
        D.shape[1], 1 / 3)))  #patch size (is assumed to be isotropic)
    hpx = np.floor(px / 2).astype(int)
    nblock = 2  # number of block per dimension
    subsize = np.ceil(np.array(data.shape) / nblock).astype(int)

    med = np.median(data)
    currentblock = 1

    for x in range(np.ceil(data.shape[0] / subsize[0]).astype(int)):
        xmin = x * subsize[0]
        xmax = np.min((data.shape[0], (x + 1) * subsize[0]))
        for y in range(np.ceil(data.shape[1] / subsize[1]).astype(int)):
            ymin = y * subsize[1]
            ymax = np.min((data.shape[1], (y + 1) * subsize[1]))
            for z in range(np.ceil(data.shape[2] / subsize[2]).astype(int)):
                zmin = z * subsize[2]
                zmax = np.min((data.shape[2], (z + 1) * subsize[2]))

                print('Processing block : ', currentblock)
                currentblock += 1

                #Enlarge subimage to take into account block effect due to non-overlapping patches
                xmin2 = np.max((0, xmin - hpx))
                xmax2 = np.min((data.shape[0], xmax + hpx))
                ymin2 = np.max((0, ymin - hpx))
                ymax2 = np.min((data.shape[1], ymax + hpx))
                zmin2 = np.max((0, zmin - hpx))
                zmax2 = np.min((data.shape[2], zmax + hpx))

                subdata = data[xmin2:xmax2, ymin2:ymax2, zmin2:zmax2]
                submask = mask[xmin2:xmax2, ymin2:ymax2, zmin2:zmax2]
                p = mp.array_to_patches(subdata,
                                        patch_shape=(px, px, px),
                                        normalization=False)
                pm = mp.array_to_patches(submask,
                                         patch_shape=(px, px, px),
                                         normalization=False)
                #remove patch we dont want to process
                index = ~np.all(pm == 0, axis=1)
                subp = p[index]
                subp -= med

                if subp.shape[0] > 0:
                    print('Number of patches to process: ', subp.shape[0])
                    #Currently, there is a bug when using n_jobs>1 (https://github.com/scikit-learn/scikit-learn/issues/5956)
                    coder = SparseCoder(dictionary=D,
                                        transform_algorithm='omp')
                    code = coder.transform(subp).astype(np.float32)
                    fmap += np.sum((np.fabs(code) > 0), axis=0)
                    subp = np.dot(code, D)
                    subp += med
                    p[index] = subp
                    suboutput = mp.patches_to_array(patches=p,
                                                    patch_shape=(px, px, px),
                                                    array_shape=subdata.shape)

                    tmpoutput = np.empty(data.shape)
                    tmpoutput[xmin2:xmax2, ymin2:ymax2,
                              zmin2:zmax2] = suboutput
                    output[xmin:xmax, ymin:ymax,
                           zmin:zmax] = tmpoutput[xmin:xmax, ymin:ymax,
                                                  zmin:zmax]


#          for a in range(D.shape[0]):
#            for s in range(subp.shape[0]):
#              subp[s,:] = code[s,a]
#            p.fill(0)
#            p[index] = subp
#            fa = mp.patches_to_array(patches=p, patch_shape=(px,px,px), array_shape=subdata.shape)
#            to = np.empty(data.shape)
#            to[xmin2:xmax2,ymin2:ymax2,zmin2:zmax2]= fa
#            fdata[xmin:xmax,ymin:ymax,zmin:zmax,a] = to[xmin:xmax,ymin:ymax,zmin:zmax]

#plt.bar(range(0,D.shape[0]), fmap)
#print('points in mask: ',np.sum(mask!=0))
#print('Number of non zero elements: ',np.sum(fmap)/np.sum(mask!=0))
#plt.show()

#  return (output,fdata)
    return output
Ejemplo n.º 4
0
def scskl_reconstruction(data,mask,D):
  output = np.zeros(data.shape)
  fmap = np.zeros((D.shape[0]))
  #fdata = np.zeros((data.shape[0],data.shape[1],data.shape[2],D.shape[0]))

  px = np.int(np.around(np.power(D.shape[1],1/3))) #patch size (is assumed to be isotropic)
  hpx = np.floor(px/2).astype(int)
  nblock = 2 # number of block per dimension
  subsize = np.ceil(np.array(data.shape) / nblock).astype(int)
  
  med = np.median(data)
  currentblock = 1
  
  for x in range(np.ceil(data.shape[0]/subsize[0]).astype(int)):
    xmin = x*subsize[0]
    xmax = np.min((data.shape[0],(x+1)*subsize[0]))
    for y in range(np.ceil(data.shape[1]/subsize[1]).astype(int)):
      ymin = y*subsize[1]
      ymax = np.min((data.shape[1],(y+1)*subsize[1]))
      for z in range(np.ceil(data.shape[2]/subsize[2]).astype(int)):  
        zmin = z*subsize[2]
        zmax = np.min((data.shape[2],(z+1)*subsize[2]))
        
        print('Processing block : ',currentblock)
        currentblock+=1
        
        #Enlarge subimage to take into account block effect due to non-overlapping patches
        xmin2 = np.max((0,xmin-hpx))
        xmax2 = np.min((data.shape[0],xmax+hpx))
        ymin2 = np.max((0,ymin-hpx))
        ymax2 = np.min((data.shape[1],ymax+hpx))
        zmin2 = np.max((0,zmin-hpx))
        zmax2 = np.min((data.shape[2],zmax+hpx))
      
        subdata = data[xmin2:xmax2,ymin2:ymax2,zmin2:zmax2]
        submask = mask[xmin2:xmax2,ymin2:ymax2,zmin2:zmax2]
        p = mp.array_to_patches(subdata,patch_shape=(px,px,px),normalization=False)
        pm = mp.array_to_patches(submask,patch_shape=(px,px,px),normalization=False)
        #remove patch we dont want to process
        index = ~np.all(pm==0,axis=1)
        subp = p[index]
        subp -= med
        
        if subp.shape[0] > 0:
          print('Number of patches to process: ',subp.shape[0])
          #Currently, there is a bug when using n_jobs>1 (https://github.com/scikit-learn/scikit-learn/issues/5956)
          coder = SparseCoder(dictionary=D, transform_algorithm='omp')
          code = coder.transform(subp).astype(np.float32)
          fmap += np.sum((np.fabs(code)>0),axis=0)
          subp = np.dot(code, D)          
          subp += med 
          p[index] = subp 
          suboutput = mp.patches_to_array(patches=p, patch_shape=(px,px,px), array_shape=subdata.shape)
          
          tmpoutput = np.empty(data.shape)
          tmpoutput[xmin2:xmax2,ymin2:ymax2,zmin2:zmax2]= suboutput      
          output[xmin:xmax,ymin:ymax,zmin:zmax] = tmpoutput[xmin:xmax,ymin:ymax,zmin:zmax]
          
#          for a in range(D.shape[0]):
#            for s in range(subp.shape[0]):
#              subp[s,:] = code[s,a]
#            p.fill(0)
#            p[index] = subp
#            fa = mp.patches_to_array(patches=p, patch_shape=(px,px,px), array_shape=subdata.shape)
#            to = np.empty(data.shape)
#            to[xmin2:xmax2,ymin2:ymax2,zmin2:zmax2]= fa      
#            fdata[xmin:xmax,ymin:ymax,zmin:zmax,a] = to[xmin:xmax,ymin:ymax,zmin:zmax]
              
            
          
  #plt.bar(range(0,D.shape[0]), fmap)
  #print('points in mask: ',np.sum(mask!=0))
  #print('Number of non zero elements: ',np.sum(fmap)/np.sum(mask!=0))
  #plt.show()
      
#  return (output,fdata)
  return output