This is an old revision of the document!


Laboratorul 10. Prelucrări de imagini - Steganography

Steganography

În transmiterea informației e util să putem trimite un mesaj secret, iar pentru aceasta trebuie să folosim diverse tehnici de codificare. Este de asemenea util să trimitem informație care aparent să nu conțină un mesaj ascuns. Steganografia presupune ascunderea unui mesaj sub forma de text, imagine, video în cadrul altui mesaj sub forma text, imagine sau video.

În acest laborator vom vedea cum putem transmite o imagine secretă, ascunsă în cadrul altei imagini (denumită imagine de transport).

Pentru a exemplifica tehnica, vom ascunde o imagine gri, de dimensiuni mai mici în cadrul unei imagini color mai mari. Pentru aceasta vom urma metoda descrisă aici: https://www.researchgate.net/publication/269705199_Digital_Image_Steganography_An_FFT_Approach În mare, metoda constă în a calcula spectrul imaginii de trasnsport și a înlocui o parte dintre coeficienții Fourier cu valorile pixelilor imaginii secrete. Vom investiga ce coeficienti sunt mai potriviti pentru a fi înlocuiți astfel încât imaginea transmisă sa nu prezinte zgomot evident și astfel încât imaginea secretă să reziste, să fie invariantă la modificări usoare ale imaginii transmise.

Exercițiul 1 -- Modulul și faza coeficienților Fourier [2p]

Primul lucru pe care îl vom investiga este importanța modulului și a fazei a coeficienților Fourier (complecși). Fiecare coeficient din spectrul Fourier $s \in S$ este un număr complex $s \in \mathbb{C}$ cu o magnitudine $|s|$ și o fază: $e^{i\phi}$ astfel încât: $s = a + i \cdot b = |s| \cdot e^{i \phi}$ .

Pentru aceasta:

  1. citim o imagine RGB cu 3 canale pentru fiecare culoare (imread) și, pentru simplitate o convertim într-o imagine cu un canal cu nivele de gri (folosim funcția rgb2gray). Pentru a fi totul mai simplu vom converti valorile în tipul 'double' și vom scala imaginea din valorile [0,255] în [0,1].
  2. luăm o imagine îi vom afla spectrul folosind Transformata Fourier Discreta implementata in Matlab în funcția 'fft2'.
  3. păstrăm doar modulul coeficienților $|s|$ și vom reface imaginea initială cu Trasnformata Fourier inversă, implementată în funcția 'ifft2'
  4. păstrăm doar faza $e^{i \phi}$ și refacem imaginea cu ifft2
  5. verificăm vizual care din cele 2 variante a păstrat mai multă informație. vizualizăm o imagine care are valori in [0,1] cu funcția 'imshow' (alternativ puteți folosi imagesc pentru o imagine nescalată).

Vom observa că informația este păstrată în principal în una dintre cele 2, asa ca putem sa schimbam cealaltă variantă înlocuind-o cu valorile imaginii pe care vrem să o ascundem.

Exercițiul 2 -- Decodificarea unei imagini ascunse [2p]

Descărcați imaginea de aici: imagine. Pentru a decodifica imaginea ascunsă, citiți imaginea (imread) și scrieți o functie după urmați urmatorii pași:

  1. calculați spectrul Fourier (fft2) al imaginii primite. Vizualizați modulul spectrului Fourier folosid functia imagesc sau funcția imshow. De ex: 'figure, imagesc(log(abs_S));impixelinfo' logaritmam pentru a atenua diferențele prea mari din spectru care ne îngreunează vizualizarea. (Funcția impixelinfo ne ofera informații despre imagine).
  2. observați vizual în spectrul apare o imagine ascunsă. De ce apare imaginea oglindită de 3 ori?
  3. normalizați spectrul prin scaderea minimului și împărțirea la valoarea diferenței dintre maxim și minim astfel încât valorile finale să fie in intervalul [0,1]
  4. selectați doar imaginea observată în spectru. Vizualizați imaginea folosind 'imshow'.

Exercițiul 3 -- Codificarea unei imagini ascunse în spectrul unui imagini de transport [5p]

Scrieți o funcție care primeste două imagini gri (doua matrici), o imaginea secreta si o imagine de transport de cel putin două ori mai mare și codifică imaginea secretă în spectrul imaginii de transport.

Urmați urmatorii pasi:

  1. calculați spectrul imaginii de transport
  2. selectati o zona din spectrul imaginii de transport pe care o veți înlocui cu valorile imaginii secrete. Zona va avea colțul din stanga-sus in locația [top,left] și va avea dimensiunea [height,width] = size(secret_image).
  3. trebuie să înlocuiți modulul (atenție: doar modulul nu si faza) spectrului din zona selectată cu valorile imaginii secrete. Intâi calculăm media valorilor spectrului din zona dorită apoi înlocuim valorile din zona cu valorile imaginii secrete scalate (de 2-10 ori mai mari decât media: ex. inmulțite cu media x 5).
  4. vrem sa trecem acest spectru înapoi în domeniul timp ( defapt este domeniu spațial dar îl denumim domeniu timp doar ca să păstrăm terminologia de pâna acum: domeniu timp –FFT–> domeniul spectral si invers).
  5. pentru a avea sens trecerea din spectrul modificat înapoi în timp trebuie să avem grijă ca spectrul format să corespundă unui semnal real valid, adică spectrul trebuie să fie periodic pe cele 2 axe și trebuie sa avem proprietatea |S(-k)| = |S(K)|. Pentru aceasta trebuie sa avem un spectru care este simetric față de jumătatea spectrului atât vertical cât și orizontal.
  6. creați specrtrul simetric și treceți în domeniul timp (spațial) cu ifft2.
  7. afisați imaginea stego - aceasta imaginea ar trebui să fie insesizabil diferita față de imaginea originală.
  8. extrageți imaginea secretă folosind funcția scrisă la punctul 2.

Exercițiul 4 -- Codificarea unei imagini secrete, gri în spectrul unui imagini color [1p]

Vrem să codificăm într-o imagine color o imagine gri sau mai multe. Pentru aceasta am putea codifica în fiecare dintre cele 3 canale RGB o imagine secretă. Pentru a avea totuși o imagine steno rezultată fară prea mult zgomot cauzat de encodarea imaginilor secrete vom avea altă abordare. Vom converti imaginea RGB în alt spațiu de culoare L*a*b, un spațiu de culoare cu 3 canale: L pentru luminanță care reprezintă majoritatea informației (echivalent cu imaginile gri cu care am lucrat până acum) și 2 canele de culoare a si b. Dacă modificăm doar canalele de culoare imaginea finala se modifică mult mai puțin sesizabil pentru un om, față de cazul în care modificăm canalele RGB sau Luminanța. De aceea vom encoda o singura imagine secretă (aceeași) în canelele a si b, lucrând cu ele individual ca și cum ar fi poze gri.

Folosind scheletul următor și funcțiile scrise precedent codificați o imagine gri într-o imagine color.

lab10_ex4.m
close all
clear all
 
height0  = 240;
width0   = 320;
 
height  = 1 * height0;
width   = 1 * width0;
%% citire
% citim imaginea de transport si o confertim din spatiul de culoare RGB in
% spatiul L*a*b*
 
img = imread('sky.jpg');
img = imresize(img, [4 * height0 + 1, 4 * width0 + 1]);
h = figure , image(img)
title('imagine originala')
print(h, '-dpng', 'steganography_imagine_originala.png');
img_lab = double(rgb2lab(img)) / 255;
 
h = figure , image(img_lab)
title('imagine originala in spatiul l*a*b')
%citim imaginea secreta si o confertim in gri
hid_img = imread('dog.jpeg');
hid_img = imresize(hid_img, [height,width]);
hid_img = double(rgb2gray(hid_img)) / 255;
 
h = figure, imshow(hid_img);
title('imagine secreta')
%% encodare
stego_a = encode_hidden_image(img_lab(:,:,2), hid_img);
stego_b = encode_hidden_image(img_lab(:,:,3), hid_img);
 
figure, imagesc(stego_a);
title('stego a')
 
stego = img_lab;
stego(:,:,2) = stego_a;
stego(:,:,3) = stego_b;
 
stego_rgb = lab2rgb(stego * 255);
savefile = 'steno_img.bmp'
% imwrite(stego_rgb,'stego_rgn.jpeg','jpeg','Mode','lossless','BitDepth',12);
imwrite(stego_rgb,savefile,'bmp');
 
%% decodare
stego_rgb_read = imread(savefile);
h = figure , image(stego_rgb_read);
title('imagine stego')
 
stego_jpeg = double(rgb2lab(stego_rgb_read))/255;
figure, imagesc(log(abs(fft2(stego_jpeg(:,:,2)))));
 
hid1 = decode_stegano_image(stego_jpeg(:,:,2));
hid2 = decode_stegano_image(stego_jpeg(:,:,3));
hid = (hid1 + hid2) / 2;
 
figure, imshow(hid);impixelinfo
title('imagine secretă recuperată')

Exercițiul 5 [BONUS 3p] -- Verificare Robustețe

Vrem să verificăm câț de robustă este metoda noastra de codificare. Pentru aceasta obținem imaginea stego prin codificarea imaginii secrete în imaginea de trasnport, efectuăm diverse transformari pe aceasta și verificăm dacă imaginea secretă este încă prezentă.

Verificați urmatoarele transformari pe imaginea stego:

  1. taiați o parte din imaginea stego: faceți negru o parte din aveasta. Cu cât taiați mai mult cu atât ar trebui ca imaginea secretă să se degradeze( fără să lipseasca vreo parte).
  2. redimensionați imaginea steno: redimensionați la 0.5 (imresize) apoi reveniți la rezoluția inițială
  3. salvați imaginea steno sub diverse formate de compresie (de ex: jpeg. png), citiți imaginea rezultă și recuperați imaginea secretă. Ar treui să observați degradare a imaginii secrete.
ps/laboratoare/10_2.1543761461.txt.gz · Last modified: 2018/12/02 16:37 by darius.necula
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0