Spaces:
Sleeping
Sleeping
| import numpy as np | |
| import cv2 | |
| def edge_directed_interpolation(lr_img_pil, scale=2): | |
| lr_img = np.array(lr_img_pil.convert("L")) | |
| h, w = lr_img.shape | |
| hr_h, hr_w = h * scale, w * scale | |
| hr_img = np.zeros((hr_h, hr_w), dtype=np.uint8) | |
| for i in range(h): | |
| for j in range(w): | |
| hr_img[i * scale, j * scale] = lr_img[i, j] | |
| for i in range(0, hr_h, scale): | |
| for j in range(0, hr_w, scale): | |
| if i + scale < hr_h and j + scale < hr_w: | |
| p1 = hr_img[i, j] | |
| p2 = hr_img[i, j + scale] | |
| p3 = hr_img[i + scale, j] | |
| p4 = hr_img[i + scale, j + scale] | |
| d1 = abs(int(p1) - int(p4)) | |
| d2 = abs(int(p2) - int(p3)) | |
| if d1 < d2: | |
| interp = (int(p1) + int(p4)) // 2 | |
| else: | |
| interp = (int(p2) + int(p3)) // 2 | |
| hr_img[i + scale // 2, j + scale // 2] = interp | |
| for i in range(hr_h): | |
| for j in range(hr_w): | |
| if hr_img[i, j] == 0: | |
| neighbors = [] | |
| if i - 1 >= 0: | |
| neighbors.append(hr_img[i - 1, j]) | |
| if i + 1 < hr_h: | |
| neighbors.append(hr_img[i + 1, j]) | |
| if j - 1 >= 0: | |
| neighbors.append(hr_img[i, j - 1]) | |
| if j + 1 < hr_w: | |
| neighbors.append(hr_img[i, j + 1]) | |
| if neighbors: | |
| hr_img[i, j] = np.mean(neighbors).astype(np.uint8) | |
| hr_img_pil = Image.fromarray(hr_img) | |
| return hr_img_pil | |