|
import gradio as gr |
|
import stc |
|
import numpy as np |
|
import imageio |
|
from scipy import signal |
|
import cv2 |
|
from PIL import Image |
|
|
|
|
|
title = "Steganography" |
|
description = "Explore hiding messages in images using content adaptive steganography and STCs. Python implementation by Daniel Lerch https://github.com/daniellerch/pySTC" |
|
|
|
def HILL(input_image, operation, message, key): |
|
input_image.seek(0) |
|
buffer = input_image.read() |
|
I = cv2.imdecode(np.frombuffer(buffer, np.uint8), 1) |
|
I = cv2.cvtColor(I,cv2.COLOR_BGR2GRAY) |
|
cv2.imwrite('tmp/file.png',I) |
|
|
|
if operation == 'decode': |
|
stc.extract('tmp/file.png', key, 'tmp/output.txt') |
|
return 'tmp/output.txt' |
|
|
|
else: |
|
H = np.array( |
|
[[-1, 2, -1], |
|
[ 2, -4, 2], |
|
[-1, 2, -1]]) |
|
L1 = np.ones((3, 3)).astype('float32')/(3**2) |
|
L2 = np.ones((15, 15)).astype('float32')/(15**2) |
|
costs = signal.convolve2d(I, H, mode='same') |
|
costs = abs(costs) |
|
costs = signal.convolve2d(costs, L1, mode='same') |
|
costs = 1/costs |
|
costs = signal.convolve2d(costs, L2, mode='same') |
|
costs[costs == np.inf] = 1 |
|
stc.embed('tmp/file.png', costs, message, key, 'tmp/stego.png') |
|
return 'tmp/stego.png' |
|
|
|
iface = gr.Interface(HILL, |
|
["file", gr.inputs.Radio(["encode", "decode"]), "text", "text"], |
|
"file", |
|
title=title, |
|
description=description) |
|
iface.launch() |