Пример #1
0
def symmetrize(mask, cx, cy):
    _mask = mask.copy()
    _mask *= _turn180(_mask, cx, cy)
    return _mask
Пример #2
0
def symmetrize(mask,cx,cy):
    _mask = mask.copy()
    _mask *= _turn180(_mask,cx,cy)
    return _mask
Пример #3
0
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])
Пример #4
0
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])