in imagenet_c_bar/corrupt.py [0:0]
def transform(self, image, time, size, eta, lens_scale, lighting_amount, softening):
def caustic_noise_kernel(point, time, size):
point = point / size
p = (point % 1) * 6.28318530718 - 250
i = p.copy()
c = 1.0
inten = 0.005
for n in range(5):
t = time * (1.0 - (3.5 / (n+1)))
i = p + np.array([np.cos(t-i[0])+np.sin(t+i[1]),np.sin(t-i[1])+np.cos(t+i[0])])
length = np.sqrt((p[0] / (np.sin(i[0]+t)/inten))**2 + (p[1] / (np.cos(i[1]+t)/inten))**2)
c += 1.0/length
c /= 5.0
c = 1.17 - c ** 1.4
color = np.clip(np.abs(c) ** 8.0, 0, 1)
return np.array([color, color, color])
def refract(incident, normal, eta):
if np.abs(np.dot(incident, normal)) >= 1.0 - 1e-3:
return incident
angle = np.arccos(np.dot(incident, normal))
out_angle = np.arcsin(np.sin(angle) / eta)
out_unrotated = np.array([np.cos(out_angle), np.sin(out_angle), 0.0])
spectator_dim = np.cross(incident, normal)
spectator_dim /= np.linalg.norm(spectator_dim)
orthogonal_dim = np.cross(normal, spectator_dim)
rotation_matrix = np.stack((normal, orthogonal_dim, spectator_dim), axis=0)
return np.matmul(np.linalg.inv(rotation_matrix), out_unrotated)
def luma_at_offset(image, origin, offset):
pixel_value = image[origin[0]+offset[0], origin[1]+offset[1], :]\
if origin[0]+offset[0] >= 0 and origin[0]+offset[0] < image.shape[0]\
and origin[1]+offset[1] >= 0 and origin[1]+offset[1] < image.shape[1]\
else np.array([0.0,0.0,0])
return np.dot(pixel_value, np.array([0.2126, 0.7152, 0.0722]))
def luma_based_refract(point, image, caustics, eta, lens_scale, lighting_amount):
north_luma = luma_at_offset(caustics, point, np.array([0,-1]))
south_luma = luma_at_offset(caustics, point, np.array([0, 1]))
west_luma = luma_at_offset(caustics, point, np.array([-1, 0]))
east_luma = luma_at_offset(caustics, point, np.array([1,0]))
lens_normal = np.array([east_luma - west_luma, south_luma - north_luma, 1.0])
lens_normal = lens_normal / np.linalg.norm(lens_normal)
refract_vector = refract(np.array([0.0, 0.0, 1.0]), lens_normal, eta) * lens_scale
refract_vector = np.round(refract_vector, 3)
out_pixel = bilinear_interpolation(image, point+refract_vector[0:2])
out_pixel += (north_luma - south_luma) * lighting_amount
out_pixel += (east_luma - west_luma) * lighting_amount
return np.clip(out_pixel, 0, 1)
noise = np.array([[caustic_noise_kernel(np.array([y,x]), time, size)\
for x in range(self.im_size)] for y in range(self.im_size)])
noise = gaussian_filter(noise, sigma=softening)
image = image.astype(np.float32) / 255
out = np.array([[luma_based_refract(np.array([y,x]), image, noise, eta, lens_scale, lighting_amount)\
for x in range(self.im_size)] for y in range(self.im_size)])
return np.clip((out * 255).astype(np.uint8), 0, 255)