Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import numpy as np | |
| import cv2 | |
| from PIL import Image | |
| # Load HED model | |
| HED_NET = cv2.dnn.readNetFromCaffe("deploy.prototxt", "hed_pretrained_bsds.caffemodel") | |
| # Edge detection | |
| def detect_edges(image_np, method): | |
| if method == "HED": | |
| inp = cv2.dnn.blobFromImage(image_np, scalefactor=1.0, size=(256, 256), | |
| mean=(104.00698793, 116.66876762, 122.67891434), | |
| swapRB=False, crop=False) | |
| HED_NET.setInput(inp) | |
| edges = HED_NET.forward()[0, 0] | |
| edges = cv2.resize(edges, (image_np.shape[1], image_np.shape[0])) | |
| return edges > np.mean(edges) | |
| elif method == "Canny": | |
| gray = cv2.cvtColor(image_np, cv2.COLOR_RGB2GRAY) | |
| edges = cv2.Canny(gray, 100, 200) | |
| return edges > 0 | |
| else: | |
| raise ValueError("Invalid edge method") | |
| # LSB extraction | |
| def extract_lsb(stego_pixels, edge_mask, secret_bits_length, x=2, y=1): | |
| height, width, channels = stego_pixels.shape | |
| extracted_bits = [] | |
| bit_index = 0 | |
| for i in range(height): | |
| for j in range(width): | |
| for c in range(channels): | |
| if bit_index >= secret_bits_length: | |
| return np.array(extracted_bits, dtype=np.uint8) | |
| n = x if edge_mask[i, j] else y | |
| if n <= 0: | |
| continue | |
| value = stego_pixels[i, j, c] & ((1 << n) - 1) | |
| for b in range(n): | |
| extracted_bits.append((value >> b) & 1) | |
| bit_index += n | |
| return np.array(extracted_bits[:secret_bits_length], dtype=np.uint8) | |
| # Convert bits to image | |
| def from_bit_array(bit_array, shape): | |
| expected_bits = np.prod(shape) * 8 | |
| bit_array = bit_array[:expected_bits] | |
| return np.packbits(bit_array).reshape(shape) | |
| # Gradio interface function | |
| def extract_interface(stego_img, edge_method): | |
| secret_shape = (128, 128) # Must match embedding shape | |
| stego_np = np.array(stego_img.convert("RGB")) | |
| edge_mask = detect_edges(stego_np, edge_method) | |
| secret_bits_len = np.prod(secret_shape) * 8 | |
| extracted_bits = extract_lsb(stego_np, edge_mask, secret_bits_len, x=2, y=1) | |
| recovered = from_bit_array(extracted_bits, secret_shape) | |
| return Image.fromarray(recovered.astype(np.uint8), mode='L') | |
| # Launch app | |
| gr.Interface( | |
| fn=extract_interface, | |
| inputs=[ | |
| gr.Image(label="Stego Image (RGB)", type="pil"), | |
| gr.Dropdown(["HED", "Canny"], label="Edge Detection Used", value="HED") | |
| ], | |
| outputs=gr.Image(label="Extracted Palmprint (128×128 grayscale)"), | |
| title="Palmprint Extractor from Stego Image", | |
| description="Upload the stego image and choose the same edge detection method used in embedding. The system will extract a 128×128 grayscale palmprint." | |
| ).launch() | |