def symmetrize(mask, cx, cy): _mask = mask.copy() _mask *= _turn180(_mask, cx, cy) return _mask
def symmetrize(mask,cx,cy): _mask = mask.copy() _mask *= _turn180(_mask,cx,cy) return _mask
def find_center_pixelwise_slow(img, msk, x0=0, y0=0, dmax=5, rmax=None): """ Find center of diffraction pattern using pixelwise comparison of centro-symmetric pixels. This is the original python implementation taken from owl/fit.py usage: ====== x,y = find_center_pixelwise_slow(img, msk, x0, y0, dmax=5, rmax=None) """ s = img.shape if rmax is None: rmax = np.sqrt(2)*max(s) cx_g = (s[1]-1)/2.+x0 cy_g = (s[0]-1)/2.+y0 cx_g = np.round(cx_g*2)/2. cy_g = np.round(cy_g*2)/2. ddc = 0.5 N_sam1= int(np.round(2*dmax/ddc))+1 cx_sam1 = np.linspace(cx_g-dmax,cx_g+dmax,N_sam1) cy_sam1 = np.linspace(cy_g-dmax,cy_g+dmax,N_sam1) N_sam2= int(np.round(4*dmax/ddc))+1 cx_sam2 = np.linspace(cx_g-dmax*2,cx_g+dmax*2,N_sam2) cy_sam2 = np.linspace(cy_g-dmax*2,cy_g+dmax*2,N_sam2) # extend mask so that every pixel has a partner at every possible center msk_ext = msk.copy() for cy in cy_sam2: for cx in cx_sam2: msk_ext *= _symmetrize(msk,cx,cy) Nme = msk_ext.sum() errs = np.zeros(shape=(N_sam1,N_sam1)) r_max_sq = rmax**2 X,Y = np.meshgrid(np.arange(img.shape[1]),np.arange(img.shape[0])) for cx,icx in zip(cx_sam1,np.arange(N_sam1)): for cy,icy in zip(cy_sam1,np.arange(N_sam1)): # SLOW CODE #for x,y,v1 in zip((Xme-cx),(Yme-cy),imgme): # M = (Xm-cx==-x)*(Ym-cy==-y) # if M.sum() == 1: # v2 = imgm[M==True] # errs[icy,icx] += abs(v1-v2) # else: # print x,y,M.sum() # FAST CODE (does the same) r_sq = ((X-cx)**2+(Y-cy)**2) rmsk = r_sq < r_max_sq img_turned = _turn180(img,cx,cy) diff = abs((img-img_turned)*msk_ext*rmsk) errs[icy,icx] = diff.sum() #print cx,cy,errs[icy,icx] errs_sm = _gaussian_smooth_2d1d(errs,dmax) i_min = errs.flatten().argmin() cxi_min = i_min % N_sam1 cyi_min = i_min/N_sam1 #if full_output: # D = {} # D["msk_ext"] = msk_ext # D["img_turned_msk_ext"] = img_turned*msk_ext # D["img_msk_ext"] = img*msk_ext # D["errmap"] = errs/errs.max() # D["errmap_sm"] = gaussian_smooth_2d1d(errs,3.) # D["errmap_sm"] /= D["errmap_sm"].max() # D["errmap_min"] = errs.min() # return cx_sam1[cxi_min],cy_sam1[cyi_min],D #else: cx_r = cx_sam1[cxi_min] cy_r = cy_sam1[cyi_min] x = cx_r-(s[1]-1)/2. y = cy_r-(s[0]-1)/2. return (x,y, errs.flatten()[i_min])