aegishield's picture
fix
876fe8c
Raw
History Blame Contribute Delete
2.83 kB
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()