R2454 commited on
Commit
21a29e4
·
1 Parent(s): 096d36f
Files changed (1) hide show
  1. app.py +37 -31
app.py CHANGED
@@ -18,56 +18,62 @@ from models.random_forest_sr import random_forest_upscale
18
  from PIL import Image
19
  import numpy as np
20
 
 
 
 
21
  def edge_directed_interpolation(lr_img_pil, scale=2):
22
- # Convert input PIL image to grayscale numpy array
23
- # lr_img = np.array(lr_img_pil.convert("L"))
24
  if isinstance(lr_img_pil, np.ndarray):
25
  lr_img_pil = Image.fromarray(lr_img_pil)
26
 
27
- lr_img = np.array(lr_img_pil.convert("L"))
28
- h, w = lr_img.shape
29
- hr_h, hr_w = h * scale, w * scale
30
 
31
- hr_img = np.zeros((hr_h, hr_w), dtype=np.uint8)
 
 
32
 
33
  # Copy original pixels to even positions
34
  for i in range(h):
35
  for j in range(w):
36
  hr_img[i * scale, j * scale] = lr_img[i, j]
37
 
38
- # Interpolate diagonal pixels
39
  for i in range(0, hr_h, scale):
40
  for j in range(0, hr_w, scale):
41
  if i + scale < hr_h and j + scale < hr_w:
42
- p1 = hr_img[i, j]
43
- p2 = hr_img[i, j + scale]
44
- p3 = hr_img[i + scale, j]
45
- p4 = hr_img[i + scale, j + scale]
 
46
 
47
- d1 = abs(int(p1) - int(p4))
48
- d2 = abs(int(p2) - int(p3))
49
 
50
- interp = (int(p1) + int(p4)) // 2 if d1 < d2 else (int(p2) + int(p3)) // 2
51
- hr_img[i + scale // 2, j + scale // 2] = interp
52
 
53
- # Fill remaining zero pixels
54
  for i in range(hr_h):
55
  for j in range(hr_w):
56
- if hr_img[i, j] == 0:
57
- neighbors = []
58
- if i - 1 >= 0:
59
- neighbors.append(hr_img[i - 1, j])
60
- if i + 1 < hr_h:
61
- neighbors.append(hr_img[i + 1, j])
62
- if j - 1 >= 0:
63
- neighbors.append(hr_img[i, j - 1])
64
- if j + 1 < hr_w:
65
- neighbors.append(hr_img[i, j + 1])
66
- if neighbors:
67
- hr_img[i, j] = np.mean(neighbors).astype(np.uint8)
68
-
69
- # Convert to PIL image (grayscale), then to RGB
70
- return Image.fromarray(hr_img).convert("RGB")
 
71
 
72
 
73
  # === Interfaces === #
 
18
  from PIL import Image
19
  import numpy as np
20
 
21
+ from PIL import Image
22
+ import numpy as np
23
+
24
  def edge_directed_interpolation(lr_img_pil, scale=2):
25
+ # Ensure input is a PIL Image
 
26
  if isinstance(lr_img_pil, np.ndarray):
27
  lr_img_pil = Image.fromarray(lr_img_pil)
28
 
29
+ # Convert to RGB
30
+ lr_img_rgb = lr_img_pil.convert("RGB")
31
+ lr_img = np.array(lr_img_rgb)
32
 
33
+ h, w, c = lr_img.shape
34
+ hr_h, hr_w = h * scale, w * scale
35
+ hr_img = np.zeros((hr_h, hr_w, c), dtype=np.uint8)
36
 
37
  # Copy original pixels to even positions
38
  for i in range(h):
39
  for j in range(w):
40
  hr_img[i * scale, j * scale] = lr_img[i, j]
41
 
42
+ # Interpolate diagonal pixels per channel
43
  for i in range(0, hr_h, scale):
44
  for j in range(0, hr_w, scale):
45
  if i + scale < hr_h and j + scale < hr_w:
46
+ for ch in range(c):
47
+ p1 = hr_img[i, j, ch]
48
+ p2 = hr_img[i, j + scale, ch]
49
+ p3 = hr_img[i + scale, j, ch]
50
+ p4 = hr_img[i + scale, j + scale, ch]
51
 
52
+ d1 = abs(int(p1) - int(p4))
53
+ d2 = abs(int(p2) - int(p3))
54
 
55
+ interp = (int(p1) + int(p4)) // 2 if d1 < d2 else (int(p2) + int(p3)) // 2
56
+ hr_img[i + scale // 2, j + scale // 2, ch] = interp
57
 
58
+ # Fill remaining zero pixels per channel
59
  for i in range(hr_h):
60
  for j in range(hr_w):
61
+ for ch in range(c):
62
+ if hr_img[i, j, ch] == 0:
63
+ neighbors = []
64
+ if i - 1 >= 0:
65
+ neighbors.append(hr_img[i - 1, j, ch])
66
+ if i + 1 < hr_h:
67
+ neighbors.append(hr_img[i + 1, j, ch])
68
+ if j - 1 >= 0:
69
+ neighbors.append(hr_img[i, j - 1, ch])
70
+ if j + 1 < hr_w:
71
+ neighbors.append(hr_img[i, j + 1, ch])
72
+ if neighbors:
73
+ hr_img[i, j, ch] = int(np.mean(neighbors))
74
+
75
+ return Image.fromarray(hr_img)
76
+
77
 
78
 
79
  # === Interfaces === #