示例#1
0
def corner_mask(position_space, mask_range):
    # Checkerboard mask for 2D mode
    x_shape = np.sqrt(position_space.shape)[0]
    y_shape = np.sqrt(position_space.shape)[0]
    xy_shape = position_space.shape[0]
    try:
        z_shape = position_space.shape[2]
    except:
        z_shape = 0
    Flag = False
    mask = np.ones(position_space.shape)
    for i in range(xy_shape):
        if ((i - np.round(mask_range * x_shape)) % x_shape) == 0 or (i % x_shape) == 0:
            Flag = not Flag
        if Flag == False or (i >= xy_shape / 2):
            mask[i] = 0
        else:
            mask[i] = 1
    if z_shape != 0:
        xy_shape = position_space.shape[0] * position_space.shape[1]
        x_shape = position_space.shape[0]
        mask = np.ones([xy_shape, z_shape])
        for z in range(z_shape):
            Flag = True
            for i in range(xy_shape):
                if ((i - np.round(mask_range * x_shape)) % x_shape) == 0 or (i % x_shape) == 0:
                    Flag = not Flag
                if Flag == False or (i >= xy_shape / 2):
                    mask[i, z] = 0
                else:
                    mask[i, z] = 1
    mask = np.reshape(mask, [position_space.shape[0], position_space.shape[1], position_space.shape[2]])
    mask = ift.Field.from_raw(position_space, mask)
    M = ift.DiagonalOperator(mask)
    return M
示例#2
0
def half_mask(position_space, mask_range):
    mask = np.ones(position_space.shape)
    x_shape = np.sqrt(position_space.shape)[0]
    xy_shape = position_space.shape[0]
    try:
        z_shape = position_space.shape[2]
    except:
        z_shape = 0
    Flag = False
    for i in range(xy_shape):
        if ((i - np.round(mask_range * x_shape)) % x_shape) == 0 or (i % x_shape) == 0:
            Flag = not Flag
        if Flag == False:
            mask[i] = 0
        else:
            mask[i] = 1
    if z_shape != 0:
        xy_shape = position_space.shape[0] * position_space.shape[1]
        x_shape = position_space.shape[0]
        mask = np.ones([xy_shape, z_shape])
        for z in range(z_shape):
            Flag = True
            for i in range(xy_shape):
                print(i)
                if ((i - np.round(mask_range * x_shape)) % x_shape) == 0 or (i % x_shape) == 0:
                    Flag = not Flag
                if Flag == False:
                    mask[i, z] = 0
                else:
                    mask[i, z] = 1
    mask = np.reshape(mask, position_space.shape)
    mask = ift.Field.from_raw(position_space, mask)
    M = ift.DiagonalOperator(mask)
    return M
示例#3
0
def checkerboard_mask(position_space, mask_range):
    x_shape = np.sqrt(position_space.shape)
    y_shape = np.sqrt(position_space.shape)
    xy_shape = position_space.shape
    checkerboard_x = np.tile(np.array([1, 1, 0, 0]), 196)
    checkerboard = np.reshape(checkerboard_x, [x_shape, y_shape]) * np.reshape(checkerboard_x, [x_shape, y_shape]).T
    mask = np.reshape(checkerboard, xy_shape)
    mask = ift.Field.from_raw(position_space, mask)
    M = ift.DiagonalOperator(mask)

    return M
示例#4
0
def random_mask(n_blobs, seed, position_space):
    ''' 
    The Code for creating a 'random mask' is mainly based on the following
    StackOverflow Answer published under CreativeCommons 4.0:
    https://stackoverflow.com/a/50751932
    Author: ImportanceOfBeingErnest [https://stackoverflow.com/users/4124317/importanceofbeingernest]
    Date of Pubilshing: 08. Jun 2018
    Visited: 10.09.2020
    Several modifications were made on the originally published code. Among others, "blobs" are filled
    with color, dimensions are adjusted to this use-case. 
    '''
    
    # Plotting-Output is suppressed by plt.ioff(). Plotting is necessary for creating a random mask.
    plt.ioff()
    def get_curve(points, **kw):
        segments = []
        for i in range(len(points) - 1):
            seg = Segment(points[i, :2], points[i + 1, :2], points[i, 2], points[i + 1, 2], **kw)
            segments.append(seg)
        curve = np.concatenate([s.curve for s in segments])
        return segments, curve

    def ccw_sort(p):
        d = p - np.mean(p, axis=0)
        s = np.arctan2(d[:, 0], d[:, 1])
        return p[np.argsort(s), :]
    
    bernstein = lambda n, k, t: binom(n,k)* t**k * (1.-t)**(n-k)

    def bezier(points, num=200):
      N = len(points)
      t = np.linspace(0, 1, num=num)
      curve = np.zeros((num, 2))
      for i in range(N):
          curve += np.outer(bernstein(N - 1, i, t), points[i])
      return curve

    class Segment():
      def __init__(self, p1, p2, angle1, angle2, **kw):
        self.p1 = p1; self.p2 = p2
        self.angle1 = angle1; self.angle2 = angle2
        self.numpoints = kw.get("numpoints", 100)
        r = kw.get("r", 0.3)
        d = np.sqrt(np.sum((self.p2-self.p1)**2))
        self.r = r*d
        self.p = np.zeros((4,2))
        self.p[0,:] = self.p1[:]
        self.p[3,:] = self.p2[:]
        self.calc_intermediate_points(self.r)

      def calc_intermediate_points(self,r):
        self.p[1,:] = self.p1 + np.array([self.r*np.cos(self.angle1),
                                    self.r*np.sin(self.angle1)])
        self.p[2,:] = self.p2 + np.array([self.r*np.cos(self.angle2+np.pi),
                                    self.r*np.sin(self.angle2+np.pi)])
        self.curve = bezier(self.p,self.numpoints)
    def get_bezier_curve(a, rad=0.2, edgy=0):
        np.random.seed(10)
        """ given an array of points *a*, create a curve through
        those points. 
        *rad* is a number between 0 and 1 to steer the distance of
          control points.
        *edgy* is a parameter which controls how "edgy" the curve is,
           edgy=0 is smoothest."""
        p = np.arctan(edgy) / np.pi + .5
        a = ccw_sort(a)
        a = np.append(a, np.atleast_2d(a[0, :]), axis=0)
        d = np.diff(a, axis=0)
        ang = np.arctan2(d[:, 1], d[:, 0])
        f = lambda ang: (ang >= 0) * ang + (ang < 0) * (ang + 2 * np.pi)
        ang = f(ang)
        ang1 = ang
        ang2 = np.roll(ang, 1)
        ang = p * ang1 + (1 - p) * ang2 + (np.abs(ang2 - ang1) > np.pi) * np.pi
        ang = np.append(ang, [ang[0]])
        a = np.append(a, np.atleast_2d(ang).T, axis=1)
        s, c = get_curve(a, r=rad, method="var")
        x, y = c.T
        return x, y, a

    def get_random_points(n=5, scale=0.8, mindst=5, rec=0):
        """ create n random points in the unit square, which are *mindst*
        apart, then scale them."""
        mindst = mindst or .7 / n
        a = np.random.rand(n, 2)
        d = np.sqrt(np.sum(np.diff(ccw_sort(a), axis=0), axis=1) ** 2)
        if np.all(d >= mindst) or rec >= 200:
            return a * scale
        else:
            return get_random_points(n=n, scale=scale, mindst=mindst, rec=rec + 1)

    fig = plt.figure()
    rad = 0.5
    edgy = 0.6
    random.seed(seed)

    for i, c in enumerate([[random.uniform(0, 1) for x in range(2)] for y in range(n_blobs)]):
        np.random.seed(i + seed)
        a = get_random_points(n=7, scale=0.2) + c
        x, y, _ = get_bezier_curve(a, rad=rad, edgy=edgy)

        plt.plot(x, y, c='black')
        plt.fill_between(x, y)
        plt.axis('off')
    fig.canvas.draw()

    data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
    data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))
    data = (data[:, :, 0] + data[:, :, 1] + data[:, :, 2]) / 3
    data = data / np.max(data)
    data[data > 0.99] = 1
    data[data != 1] = 0

    data = resize(data, [50, 50])
    data[data < 0.75] = 0
    data[data >= 0.75] = 1
    if 50 - position_space.shape[0] - 10 > 0:
        data = data[50 - position_space.shape[0] - 10:50 - 10, 50 - position_space.shape[0] - 10:50 - 10]
        data = np.reshape(data, position_space.shape[0] * position_space.shape[1])
        data_3D = np.zeros([32,32,3])
        data_3D[:,:,0] = np.reshape(data, [32, 32])
        data_3D[:,:,1] = np.reshape(data, [32, 32])
        data_3D[:,:,2] = np.reshape(data, [32, 32])
        data = data_3D
    else:
        data = data[50 - np.int(np.sqrt(position_space.shape[0])) - 10:50 - 10,
               50 - np.int(np.sqrt(position_space.shape[0])) - 10:50 - 10]
        data = np.reshape(data, position_space.shape[0])

    data = np.array(data)
    
    # Restore original plotting settings as these were overwritten by plt.ioff()
    plt.close()
    plt.ion()
    mpl.rcParams['figure.dpi']= 200
    mpl.rcParams['font.size'] = 9.0
 
    mask = ift.Field.from_raw(position_space, data)
    M = ift.DiagonalOperator(mask)
    return M
示例#5
0
def no_mask(position_space):
    mask = np.ones(position_space.shape)
    mask = ift.Field.from_raw(position_space, mask)
    M = ift.DiagonalOperator(mask)
    return M