-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathextract_stego_image.py
46 lines (38 loc) · 1.82 KB
/
extract_stego_image.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#------ External Libraries ------#
import cv2
import struct
import bitstring
import numpy as np
import zigzag as zz
#================================#
#---------- Source Files --------#
import data_embedding as stego
import run_stego_algorithm as src
import image_preparation as img
from scipy.linalg import fractional_matrix_power
#================================#
# ============================================================================= #
# ============================================================================= #
# =========================== BEGIN CODE OPERATION ============================ #
# ============================================================================= #
# ============================================================================= #
alpha = 1.25
stego_image = cv2.imread(src.STEGO_IMAGE_FILEPATH, flags=cv2.IMREAD_COLOR)
stego_image_f32 = np.float32(stego_image)
stego_image_YCC = img.YCC_Image(cv2.cvtColor(stego_image_f32, cv2.COLOR_BGR2YCrCb))
# FORWARD DCT STAGE
dct_blocks = [cv2.dct(block) for block in stego_image_YCC.channels[0]] # Only care about Luminance layer
dct_blocks = [fractional_matrix_power(q_dct_Block,alpha) for q_dct_Block in dct_blocks]
# QUANTIZATION STAGE
dct_quants = [np.around(np.divide(item, img.JPEG_STD_LUM_QUANT_TABLE)) for item in dct_blocks]
# Sort DCT coefficients by frequency
sorted_coefficients = [zz.zigzag(block) for block in dct_quants]
# DATA EXTRACTION STAGE
recovered_data = stego.extract_encoded_data_from_DCT(sorted_coefficients)
# Determine length of secret message
data_len = int(recovered_data.read('uint:32') / 8)
# Extract secret message from DCT coefficients
extracted_data = bytes()
for _ in range(data_len): extracted_data += struct.pack('>B', recovered_data.read('uint:8'))
# Print secret message back to the user
print(extracted_data.decode('ascii'))