import numpy as np def joinCmapX(cmap1,cmap2): nclus1 = np.max(cmap1) cmap2=np.where(cmap2!=0,cmap2+nclus1,0) old_nclus=0 new_nclus=1 while new_nclus!= old_nclus: old_nclus=new_nclus for i in range(cmap1.shape[1]): for j in range(cmap1.shape[2]): if cmap1[-1,i,j] != 0 and cmap2[0,i,j] !=0: if cmap1[-1,i,j] != cmap2[0,i,j]: cmap2=np.where(cmap2==cmap2[0,i,j],cmap1[-1,i,j],cmap2) for i in range(cmap1.shape[1]): for j in range(cmap1.shape[2]): if cmap1[-1,i,j] != 0 and cmap2[0,i,j] !=0: if cmap1[-1,i,j] != cmap2[0,i,j]: cmap1=np.where(cmap1==cmap1[-1,i,j],cmap2[0,i,j],cmap1) cmap=np.append(cmap1,cmap2,axis=0) y = np.bincount(cmap.reshape(-1).astype(int)) ii = np.nonzero(y)[0] cf=np.vstack((ii,y[ii])).T #numero de cluster, frecuencia new_nclus=cf.shape[0] #cantidad de clusters #print(new_nclus) return cmap def joinCmapY(cmap1,cmap2): nclus1 = np.max(cmap1) cmap2=np.where(cmap2!=0,cmap2+nclus1,0) old_nclus=0 new_nclus=1 while new_nclus!= old_nclus: old_nclus=new_nclus for i in range(cmap1.shape[0]): for j in range(cmap1.shape[2]): if cmap1[i,-1,j] != 0 and cmap2[i,0,j] !=0: if cmap1[i,-1,j] != cmap2[i,0,j]: cmap2=np.where(cmap2==cmap2[i,0,j],cmap1[i,-1,j],cmap2) for i in range(cmap1.shape[0]): for j in range(cmap1.shape[2]): if cmap1[i,-1,j] != 0 and cmap2[i,0,j] !=0: if cmap1[i,-1,j] != cmap2[i,0,j]: cmap1=np.where(cmap1==cmap1[i,-1,j],cmap2[i,0,j],cmap1) cmap=np.append(cmap1,cmap2,axis=1) y = np.bincount(cmap.reshape(-1).astype(int)) ii = np.nonzero(y)[0] cf=np.vstack((ii,y[ii])).T #numero de cluster, frecuencia new_nclus=cf.shape[0] #cantidad de clusters #print(new_nclus) return cmap def joinCmapZ(cmap1,cmap2): nclus1 = np.max(cmap1) cmap2=np.where(cmap2!=0,cmap2+nclus1,0) old_nclus=0 new_nclus=1 while new_nclus!= old_nclus: old_nclus=new_nclus for i in range(cmap1.shape[0]): for j in range(cmap1.shape[1]): if cmap1[i,j,-1] != 0 and cmap2[i,j,0] !=0: if cmap1[i,j,-1] != cmap2[i,j,0]: cmap2=np.where(cmap2==cmap2[i,j,0],cmap1[i,j,-1],cmap2) for i in range(cmap1.shape[0]): for j in range(cmap1.shape[1]): if cmap1[i,j,-1] != 0 and cmap2[i,j,0] !=0: if cmap1[i,j,-1] != cmap2[i,j,0]: cmap1=np.where(cmap1==cmap1[i,j,-1],cmap2[i,j,0],cmap1) cmap=np.append(cmap1,cmap2,axis=2) y = np.bincount(cmap.reshape(-1).astype(int)) ii = np.nonzero(y)[0] cf=np.vstack((ii,y[ii])).T #numero de cluster, frecuencia new_nclus=cf.shape[0] #cantidad de clusters #print(new_nclus) return cmap def joinBox(vec,join_y,join_z): Nx, Ny,Nz=vec.shape[0],vec.shape[1],vec.shape[2] nx = Nx//2 ny,nz=Ny, Nz if join_y: ny=Ny//2 if join_z: nz=Nz//2 vec[:,:ny,:nz] = joinCmapX(vec[:nx,:ny,:nz],vec[nx:,:ny,:nz]) if not join_z and not join_y: return vec if join_y: vec[:,ny:,:nz] = joinCmapX(vec[:nx,ny:,:nz],vec[nx:,ny:,:nz]) if join_z: vec[:,:ny,nz:] = joinCmapX(vec[:nx,:ny,nz:],vec[nx:,:ny,nz:]) if join_z and join_y: vec[:,ny:,nz:] = joinCmapX(vec[:nx,ny:,nz:],vec[nx:,ny:,nz:]) if join_y: vec[:,:,:nz] = joinCmapY(vec[:,:ny,:nz],vec[:,ny:,:nz]) if join_z: if join_y: vec[:,:,nz:] = joinCmapY(vec[:,:ny,nz:],vec[:,ny:,nz:]) vec[:,:,:] = joinCmapZ(vec[:,:,:nz],vec[:,:,nz:]) return vec