experiments/overlap/augmentations/distortion.py [161:197]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        return {'num_per_axis' : num_per_axis, 'angles' : angles, 'amount' : amount}

    def transform(self, image, num_per_axis, angles, amount):

        def warp_kernel(point, center, radius, amount, angle):
            dx = point[0] - center[0]
            dy = point[1] - center[1]
            dist = np.linalg.norm(point - center)

            if dist > radius or np.round(dist, 3) == 0.0:
                return point

            d = dist / radius
            t = np.sin(np.pi * 0.5 * d) ** (- amount)

            dx *= t
            dy *= t

            e = 1 - d
            a = angle * (e ** 2)
            
            out = center + np.array([dx*np.cos(a) - dy*np.sin(a), dx*np.sin(a) + dy*np.cos(a)])

            return out

        out = image.copy().astype(np.float32)
        grid_size = self.im_size // num_per_axis
        radius = grid_size / 2
        for i in range(num_per_axis):
            for j in range(num_per_axis):
                l, r = i * grid_size, (i+1) * grid_size
                u, d = j * grid_size, (j+1) * grid_size
                center = np.array([u+radius, l+radius])
                out[u:d,l:r,:] = np.array([[bilinear_interpolation(out, warp_kernel(np.array([y,x]), center, radius, amount, angles[i,j]))\
                        for x in np.arange(l,r)] for y in np.arange(u,d)])

        return np.clip(out, 0, 255).astype(np.uint8)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



imagenet_c_bar/corrupt.py [815:851]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        return {'num_per_axis' : num_per_axis, 'angles' : angles, 'amount' : amount}

    def transform(self, image, num_per_axis, angles, amount):

        def warp_kernel(point, center, radius, amount, angle):
            dx = point[0] - center[0]
            dy = point[1] - center[1]
            dist = np.linalg.norm(point - center)

            if dist > radius or np.round(dist, 3) == 0.0:
                return point

            d = dist / radius
            t = np.sin(np.pi * 0.5 * d) ** (- amount)

            dx *= t
            dy *= t

            e = 1 - d
            a = angle * (e ** 2)
            
            out = center + np.array([dx*np.cos(a) - dy*np.sin(a), dx*np.sin(a) + dy*np.cos(a)])

            return out

        out = image.copy().astype(np.float32)
        grid_size = self.im_size // num_per_axis
        radius = grid_size / 2
        for i in range(num_per_axis):
            for j in range(num_per_axis):
                l, r = i * grid_size, (i+1) * grid_size
                u, d = j * grid_size, (j+1) * grid_size
                center = np.array([u+radius, l+radius])
                out[u:d,l:r,:] = np.array([[bilinear_interpolation(out, warp_kernel(np.array([y,x]), center, radius, amount, angles[i,j]))\
                        for x in np.arange(l,r)] for y in np.arange(u,d)])

        return np.clip(out, 0, 255).astype(np.uint8)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



