Spaces:
Running
Running
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 | |