Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -15,12 +15,12 @@ def string_to_binary_labels(s: str) -> list[int]:
|
|
15 |
return bits
|
16 |
|
17 |
def image_to_binary_labels(img: Image.Image, max_pixels: int = 256) -> list[int]:
|
18 |
-
img = img.convert("
|
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 = (flat
|
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)
|
@@ -35,12 +35,27 @@ def binary_labels_to_image(binary_labels: list[int], width: int = None, height:
|
|
35 |
img = Image.fromarray(image_array, mode='L')
|
36 |
return img
|
37 |
|
38 |
-
def
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
|
45 |
mutation_site_headers = [
|
46 |
3244, 3297, 3350, 3399, 3455, 3509, 3562, 3614,
|
@@ -128,12 +143,13 @@ with tab2:
|
|
128 |
)
|
129 |
|
130 |
st.subheader("Reconstruct Image from Binary Labels")
|
131 |
-
|
132 |
-
reconstructed_img = binary_labels_to_image(binary_labels)
|
133 |
-
st.image(reconstructed_img, caption="Reconstructed Grayscale Image", use_column_width=True)
|
134 |
|
135 |
-
|
136 |
-
|
137 |
-
|
|
|
|
|
|
|
138 |
|
139 |
-
# Future: integrate DNA editor mapping for each mutation site here
|
|
|
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)
|
|
|
35 |
img = Image.fromarray(image_array, mode='L')
|
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]
|
50 |
+
g_bits = binary_labels[i+8:i+16]
|
51 |
+
b_bits = binary_labels[i+16:i+24]
|
52 |
+
r = sum(b << (7-j) for j, b in enumerate(r_bits))
|
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,
|
|
|
143 |
)
|
144 |
|
145 |
st.subheader("Reconstruct Image from Binary Labels")
|
146 |
+
option = st.radio("Choose Reconstruction Mode", ["Grayscale", "True Color (RGB)"])
|
|
|
|
|
147 |
|
148 |
+
if st.button("Reconstruct Image"):
|
149 |
+
if option == "Grayscale":
|
150 |
+
reconstructed_img = binary_labels_to_image(binary_labels)
|
151 |
+
else:
|
152 |
+
reconstructed_img = binary_labels_to_rgb_image(binary_labels)
|
153 |
+
st.image(reconstructed_img, caption="Reconstructed Image", use_column_width=True)
|
154 |
|
155 |
+
# Future: integrate DNA editor mapping for each mutation site here
|