Spaces:
Sleeping
Sleeping
| import numpy as np | |
| import scipy | |
| from PIL import Image | |
| VALUE = 512 | |
| def resize(value,img): | |
| img = Image.open(img) | |
| #img = img.resize((value,value), Image.Resampling.LANCZOS) | |
| img.thumbnail((VALUE,VALUE), Image.Resampling.LANCZOS) | |
| return img | |
| def get_mask(img,p): | |
| w,h=img.size | |
| return np.random.choice(a=[False, True], size=(w, h), p=[p, 1-p]) | |
| def generate_points(mask): | |
| (w,h) = mask.shape | |
| noise_points = [] | |
| color_points = [] | |
| for x in range(w): | |
| for y in range(h): | |
| if mask[x,y]: | |
| color_points.append(np.array([x,y])) | |
| else: | |
| noise_points.append(np.array([x,y])) | |
| return color_points, noise_points | |
| def encoder_cp(img,color_points): | |
| w,h=img.size | |
| img2=Image.new('RGB',(w,h)) | |
| for p in color_points: | |
| t = img.getpixel((p[0],p[1])) | |
| img2.putpixel((p[0],p[1]),(t[0],t[1],t[2])) | |
| return img2 | |
| def encoder(img,p=0.95): | |
| img = resize(VALUE,img) | |
| mask = get_mask(img,p) | |
| c_p, n_p = generate_points(mask) | |
| return encoder_cp(img, c_p) | |
| def get_points(img): | |
| w,h=img.size | |
| noise_points = [] | |
| color_points = [] | |
| for x in range(w): | |
| for y in range(h): | |
| t = img.getpixel((x,y)) | |
| if np.sum(t[:3]) > 0 : | |
| color_points.append(np.array([x,y])) | |
| else: | |
| noise_points.append(np.array([x,y])) | |
| return color_points, noise_points | |
| def restore(img, k, color_points, noise_points): | |
| kdtree = scipy.spatial.KDTree(color_points) | |
| for p in noise_points: | |
| _, knn_p = kdtree.query(p, k) | |
| r_m = [] | |
| v_m = [] | |
| b_m = [] | |
| if k == 1: | |
| c_p = color_points[knn_p] | |
| t = img.getpixel((c_p[0],c_p[1])) | |
| img.putpixel((p[0],p[1]),(t[0],t[1],t[2])) | |
| else: | |
| for c_p in [color_points[j] for j in list(knn_p)]: | |
| t = img.getpixel((c_p[0],c_p[1])) | |
| r_m.append(t[0]) | |
| v_m.append(t[1]) | |
| b_m.append(t[2]) | |
| r_m = int(sum(r_m)/k) | |
| v_m = int(sum(v_m)/k) | |
| b_m = int(sum(b_m)/k) | |
| img.putpixel((p[0],p[1]),(r_m,v_m,b_m)) | |
| return img | |
| def decoder(img,k=1): | |
| img = resize(VALUE,img) | |
| c_p, n_p = get_points(img) | |
| return restore(img,int(k),c_p,n_p) | |
| def decoder_noise(img,k=1): | |
| img = Image.fromarray(img) | |
| #img = resize(VALUE,img) | |
| c_p, n_p = get_points(img) | |
| return restore(img,int(k),c_p,n_p) |