wenjun99 commited on
Commit
56ff5cb
·
verified ·
1 Parent(s): e59d9f1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +30 -7
app.py CHANGED
@@ -3,10 +3,13 @@ from PIL import Image
3
  import numpy as np
4
  import pandas as pd
5
 
6
-
7
  # Simple app: convert user input into ASCII codes and binary labels
8
 
9
  def string_to_binary_labels(s: str) -> list[int]:
 
 
 
 
10
  bits: list[int] = []
11
  for char in s:
12
  ascii_code = ord(char)
@@ -14,15 +17,27 @@ def string_to_binary_labels(s: str) -> list[int]:
14
  bits.extend(char_bits)
15
  return bits
16
 
17
- def image_to_binary_labels(img: Image.Image, max_pixels: int = 256) -> list[int]:
 
 
 
 
18
  img = img.convert("RGB")
19
  img.thumbnail((int(np.sqrt(max_pixels)), int(np.sqrt(max_pixels))))
20
  img_array = np.array(img)
21
- flat = img_array.flatten()
22
- binarized = [(pixel >> bit) & 1 for pixel in flat for bit in range(7, -1, -1)]
23
- return binarized
 
 
 
 
 
24
 
25
  def binary_labels_to_image(binary_labels: list[int], width: int = None, height: int = None) -> Image.Image:
 
 
 
26
  total_pixels = len(binary_labels)
27
  if width is None or height is None:
28
  side = int(np.ceil(np.sqrt(total_pixels)))
@@ -36,14 +51,19 @@ def binary_labels_to_image(binary_labels: list[int], width: int = None, height:
36
  return img
37
 
38
  def binary_labels_to_rgb_image(binary_labels: list[int], width: int = None, height: int = None) -> Image.Image:
 
 
 
39
  total_pixels = len(binary_labels) // 24
40
  if width is None or height is None:
41
  side = int(np.ceil(np.sqrt(total_pixels)))
42
  width = height = side
 
43
  needed_pixels = width * height
44
  needed_bits = needed_pixels * 24
45
  if len(binary_labels) < needed_bits:
46
  binary_labels += [0] * (needed_bits - len(binary_labels))
 
47
  pixels = []
48
  for i in range(0, needed_bits, 24):
49
  r_bits = binary_labels[i:i+8]
@@ -53,10 +73,12 @@ def binary_labels_to_rgb_image(binary_labels: list[int], width: int = None, heig
53
  g = sum(b << (7-j) for j, b in enumerate(g_bits))
54
  b = sum(b << (7-j) for j, b in enumerate(b_bits))
55
  pixels.append((r, g, b))
 
56
  array = np.array(pixels, dtype=np.uint8).reshape((height, width, 3))
57
  img = Image.fromarray(array, mode='RGB')
58
  return img
59
 
 
60
  mutation_site_headers = [
61
  3244, 3297, 3350, 3399, 3455, 3509, 3562, 3614,
62
  3665, 3720, 3773, 3824, 3879, 3933, 3985, 4039,
@@ -66,6 +88,7 @@ mutation_site_headers = [
66
 
67
  st.title("ASCII & Binary Label Converter")
68
 
 
69
  tab1, tab2 = st.tabs(["Text to Binary Labels", "Image to Binary Labels"])
70
 
71
  with tab1:
@@ -115,9 +138,9 @@ with tab2:
115
  img = Image.open(uploaded_file)
116
  st.image(img, caption="Uploaded Image", use_column_width=True)
117
 
118
- max_pixels = st.slider("Max number of pixels to encode", min_value=32, max_value=2056, value=1024, step=32)
119
 
120
- binary_labels = image_to_binary_labels(img, max_pixels=max_pixels)
121
 
122
  st.subheader("Binary Labels from Image")
123
  num_groups = (len(binary_labels) + 31) // 32
 
3
  import numpy as np
4
  import pandas as pd
5
 
 
6
  # Simple app: convert user input into ASCII codes and binary labels
7
 
8
  def string_to_binary_labels(s: str) -> list[int]:
9
+ """
10
+ Convert a string into a flat list of binary labels (0 or 1) representing
11
+ each character's 8-bit ASCII code.
12
+ """
13
  bits: list[int] = []
14
  for char in s:
15
  ascii_code = ord(char)
 
17
  bits.extend(char_bits)
18
  return bits
19
 
20
+ def image_to_binary_labels_rgb(img: Image.Image, max_pixels: int = 256) -> list[int]:
21
+ """
22
+ Convert an RGB image to binary labels (0/1).
23
+ Store full RGB values (24 bits per pixel).
24
+ """
25
  img = img.convert("RGB")
26
  img.thumbnail((int(np.sqrt(max_pixels)), int(np.sqrt(max_pixels))))
27
  img_array = np.array(img)
28
+ flat_pixels = img_array.reshape(-1, 3)
29
+
30
+ bits = []
31
+ for pixel in flat_pixels:
32
+ for channel in pixel: # R, G, B
33
+ channel_bits = [(channel >> bit) & 1 for bit in range(7, -1, -1)]
34
+ bits.extend(channel_bits)
35
+ return bits
36
 
37
  def binary_labels_to_image(binary_labels: list[int], width: int = None, height: int = None) -> Image.Image:
38
+ """
39
+ Convert binary labels (0/1) into a grayscale image.
40
+ """
41
  total_pixels = len(binary_labels)
42
  if width is None or height is None:
43
  side = int(np.ceil(np.sqrt(total_pixels)))
 
51
  return img
52
 
53
  def binary_labels_to_rgb_image(binary_labels: list[int], width: int = None, height: int = None) -> Image.Image:
54
+ """
55
+ Convert binary labels (0/1) into an RGB image.
56
+ """
57
  total_pixels = len(binary_labels) // 24
58
  if width is None or height is None:
59
  side = int(np.ceil(np.sqrt(total_pixels)))
60
  width = height = side
61
+
62
  needed_pixels = width * height
63
  needed_bits = needed_pixels * 24
64
  if len(binary_labels) < needed_bits:
65
  binary_labels += [0] * (needed_bits - len(binary_labels))
66
+
67
  pixels = []
68
  for i in range(0, needed_bits, 24):
69
  r_bits = binary_labels[i:i+8]
 
73
  g = sum(b << (7-j) for j, b in enumerate(g_bits))
74
  b = sum(b << (7-j) for j, b in enumerate(b_bits))
75
  pixels.append((r, g, b))
76
+
77
  array = np.array(pixels, dtype=np.uint8).reshape((height, width, 3))
78
  img = Image.fromarray(array, mode='RGB')
79
  return img
80
 
81
+ # Predefined headers for the 32 mutation sites
82
  mutation_site_headers = [
83
  3244, 3297, 3350, 3399, 3455, 3509, 3562, 3614,
84
  3665, 3720, 3773, 3824, 3879, 3933, 3985, 4039,
 
88
 
89
  st.title("ASCII & Binary Label Converter")
90
 
91
+ # Create tabs
92
  tab1, tab2 = st.tabs(["Text to Binary Labels", "Image to Binary Labels"])
93
 
94
  with tab1:
 
138
  img = Image.open(uploaded_file)
139
  st.image(img, caption="Uploaded Image", use_column_width=True)
140
 
141
+ max_pixels = st.slider("Max number of pixels to encode", min_value=32, max_value=1024, value=256, step=32)
142
 
143
+ binary_labels = image_to_binary_labels_rgb(img, max_pixels=max_pixels)
144
 
145
  st.subheader("Binary Labels from Image")
146
  num_groups = (len(binary_labels) + 31) // 32