def nanFilter(af, kernel=3): """ 3D phase contrast filter often creates 'nan' this filter removes nan by averaging surrounding pixels return af """ af = af.copy() shape = N.array(af.shape) radius = N.subtract(kernel, 1) // 2 box = kernel * af.ndim nan = N.isnan(af) nids = N.array(N.nonzero(nan)).T for nidx in nids: slc = [slice(idx, idx + 1) for idx in nidx] slices = [] for dim in range(af.ndim): slc2 = slice(slc[dim].start - radius, slc[dim].stop + radius) while slc2.start < 0: slc2 = slice(slc2.start + 1, slc2.stop) while slc2.stop > shape[dim]: slc2 = slice(slc2.start, slc2.stop - 1) slices.append(slc2) val = af[slices] nanlocal = N.isnan(val) ss = N.sum(N.where(nanlocal, 0, val)) / float((box - N.sum(nanlocal))) af[slc] = ss return af
def nanFilter(af, kernel=3): """ 3D phase contrast filter often creates 'nan' this filter removes nan by averaging surrounding pixels return af """ af = af.copy() shape = N.array(af.shape) radius = N.subtract(kernel, 1) // 2 box = kernel * af.ndim nan = N.isnan(af) nids = N.array(N.nonzero(nan)).T for nidx in nids: slc = [slice(idx,idx+1) for idx in nidx] slices = [] for dim in range(af.ndim): slc2 = slice(slc[dim].start - radius, slc[dim].stop + radius) while slc2.start < 0: slc2 = slice(slc2.start + 1, slc2.stop) while slc2.stop > shape[dim]: slc2 = slice(slc2.start, slc2.stop -1) slices.append(slc2) val = af[slices] nanlocal = N.isnan(val) ss = N.sum(N.where(nanlocal, 0, val)) / float((box - N.sum(nanlocal))) af[slc] = ss return af
def centerOfMass(img, yx, window=5): """ find peak by center of mass in a 2D image img: a 2D image array yx: (y,x) in the image window: a window where CM calculation is performed on return yx """ # prepare small image s = N.array([window,window]) c = s/2. yx = N.round_(yx) yx -= c yi, xi = N.indices(s) yi += yx[0] xi += yx[1] cc = img[yi,xi] # calculate center of mass yxi = N.indices(s) yxi *= cc yxi = yxi.T vv = N.sum(yxi, axis=0) vv = N.sum(vv, axis=0) yxs = vv / float(N.sum(cc)) yxs += yx return yxs
def centerOfMass(img, yx, window=5): """ find peak by center of mass in a 2D image img: a 2D image array yx: (y,x) in the image window: a window where CM calculation is performed on return yx """ # prepare small image s = N.array([window, window]) c = s / 2. yx = N.round_(yx) yx -= c yi, xi = N.indices(s) yi += yx[0] xi += yx[1] cc = img[yi, xi] # calculate center of mass yxi = N.indices(s) yxi *= cc yxi = yxi.T vv = N.sum(yxi, axis=0) vv = N.sum(vv, axis=0) yxs = vv / float(N.sum(cc)) yxs += yx return yxs
def arr_edgeFilter(img, sigma=1.5): """ average-deviation with a gaussian prefilter img must be in an even shape """ if sigma: g = gaussianArrND(img.shape, sigma) g = F.shift(g) img = F.convolve(img.astype(N.float32), g) gr = N.gradient(img.astype(N.float32)) ff = N.sum(N.power(gr, 2), 0) return ff
def img2polar2D(img, center, final_radius=None, initial_radius=None, phase_width=360, return_idx=False): """ img: array center: coordinate y, x final_radius: ending radius initial_radius: starting radius phase_width: npixles / circle return_idx: return transformation coordinates (y,x) """ if img.ndim > 2 or len(center) > 2: raise ValueError( 'this function only support 2D, you entered %i-dim array and %i-dim center coordinate' % (img.ndim, len(center))) if initial_radius is None: initial_radius = 0 if final_radius is None: rad0 = N.ceil(N.array(img.shape) - center) final_radius = min((int(min(rad0)), int(min(N.ceil(center))))) if phase_width is None: phase_width = N.sum(img.shape[-2:]) * 2 theta, R = np.meshgrid(np.linspace(0, 2 * np.pi, phase_width), np.arange(initial_radius, final_radius)) Ycart, Xcart = polar2cart2D(R, theta, center) Ycart = N.where(Ycart >= img.shape[0], img.shape[0] - 1, Ycart) Xcart = N.where(Xcart >= img.shape[1], img.shape[1] - 1, Xcart) Ycart = Ycart.astype(int) Xcart = Xcart.astype(int) polar_img = img[Ycart, Xcart] polar_img = np.reshape(polar_img, (final_radius - initial_radius, phase_width)) if return_idx: return polar_img, Ycart, Xcart else: return polar_img
def img2polar2D(img, center, final_radius=None, initial_radius = None, phase_width = 360, return_idx=False): """ img: array center: coordinate y, x final_radius: ending radius initial_radius: starting radius phase_width: npixles / circle return_idx: return transformation coordinates (y,x) """ if img.ndim > 2 or len(center) > 2: raise ValueError('this function only support 2D, you entered %i-dim array and %i-dim center coordinate' % (img.ndim, len(center))) if initial_radius is None: initial_radius = 0 if final_radius is None: rad0 = N.ceil(N.array(img.shape) - center) final_radius = min((int(min(rad0)), int(min(N.ceil(center))))) if phase_width is None: phase_width = N.sum(img.shape[-2:]) * 2 theta , R = np.meshgrid(np.linspace(0, 2*np.pi, phase_width), np.arange(initial_radius, final_radius)) Ycart, Xcart = polar2cart2D(R, theta, center) Ycart = N.where(Ycart >= img.shape[0], img.shape[0]-1, Ycart) Xcart = N.where(Xcart >= img.shape[1], img.shape[1]-1, Xcart) Ycart = Ycart.astype(int) Xcart = Xcart.astype(int) polar_img = img[Ycart,Xcart] polar_img = np.reshape(polar_img,(final_radius-initial_radius,phase_width)) if return_idx: return polar_img, Ycart, Xcart else: return polar_img