Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ps:laboratoare:10_2 [2018/12/03 11:46]
ionut.gorgos
ps:laboratoare:10_2 [2020/10/07 18:33] (current)
ionut.gorgos
Line 17: Line 17:
  
 Pentru aceasta: Pentru aceasta:
-  - citim o imagine RGB cu 3 canale pentru fiecare culoare, folosind funcția '​imread'​ din MATLAB ș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]. ​ +  - citim o imagine RGB cu 3 canale pentru fiecare culoare, folosind funcția '​imread'​ din MATLAB ș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]. ​Afisați imaginea folosind functia '​imagesc'​. ​
   - luăm o imagine și încercăm să îi aflăm spectrul folosind Transformata Fourier Discretă implementată în MATLAB, cu ajutorul funcției '​fft2'​.   - luăm o imagine și încercăm să îi aflăm spectrul folosind Transformata Fourier Discretă implementată în MATLAB, cu ajutorul funcției '​fft2'​.
   - păstrăm doar modulul coeficienților $|s|$ și vom reface imaginea inițială cu Trasnformata Fourier Inversă, implementată în funcția '​ifft2'​.   - păstrăm doar modulul coeficienților $|s|$ și vom reface imaginea inițială cu Trasnformata Fourier Inversă, implementată în funcția '​ifft2'​.
Line 27: Line 27:
  
 Vom observa că informația este păstrată în principal în una dintre cele 2, așa că putem să schimbăm cealaltă variantă înlocuind-o cu valorile imaginii pe care vrem să o ascundem. ​ Vom observa că informația este păstrată în principal în una dintre cele 2, așa că putem să schimbăm cealaltă variantă înlocuind-o cu valorile imaginii pe care vrem să o ascundem. ​
- 
- <​hidden> ​ 
-<​note>​ 
-O posibilă soluție: 
-<code matlab lab10_ex1_modul_vs_faza.m>​ 
-close all 
-clear all 
- 
-height ​ = 240; 
-width   = 320; 
- 
-% citim imaginile, le convertim in gri si le normalizam 
-img = imread('​peppers.png'​);​ 
-img = double(rgb2gray(img)) / 255; 
- 
-h = figure, imshow(img);​impixelinfo 
-title('​imagine originala'​) 
- 
-% aflam spectrul S(k) al imaginii 
-S = fft2(img); 
- 
-% investigam diferente dintre reconstructia din tot spectrul, reconstructia 
-% doar din modulul spectrului si reconstructia din faza spectrului 
-img_res = ifft2(S); 
-h = figure, imshow(normalise(img_res));​impixelinfo 
-title('​imagine restituita din spectrul complet'​) 
- 
-img_res_abs = ifft2(abs(S));​ 
-h = figure, imshow(normalise(img_res_abs));​impixelinfo 
-title('​imagine restituita din modulul spectrului fourier'​) 
- 
-phase_S = S ./ abs(S); 
-img_res_ph = ifft2(phase_S);​ 
-h = figure, imshow(normalise(img_res_ph));​impixelinfo 
-title('​imagine restituita din faza spectrului fourier'​) 
-</​code>​ 
-</​note>​ 
-</​hidden> ​ 
  
 === Exercițiul 2 -- Decodificarea unei imagini ascunse [2p] === === Exercițiul 2 -- Decodificarea unei imagini ascunse [2p] ===
Line 74: Line 36:
   - normalizați spectrul prin scăderea minimului și împărțirea la valoarea diferenței dintre maxim și minim astfel încât valorile finale să fie în intervalul [0,1].   - normalizați spectrul prin scăderea minimului și împărțirea la valoarea diferenței dintre maxim și minim astfel încât valorile finale să fie în intervalul [0,1].
   - selectați doar imaginea observată în spectru. Vizualizați imaginea folosind '​imshow'​. ​   - selectați doar imaginea observată în spectru. Vizualizați imaginea folosind '​imshow'​. ​
- 
-<​hidden> ​ 
- 
-<​note>​ 
-O posibilă soluție: 
- 
-<code matlab decode_stegano_image.m>​ 
-function hidden_img = decode_stegano_image(stego_image) 
- 
-top     = 100; 
-left    = 100; 
-height ​ = 240; 
-width   = 320; 
- 
-fft_steno_double = fft2(stego_image);​ 
-fft_steno_double = normalise(fft_steno_double);​ 
-hidden_img = abs(fft_steno_double(top+1:​ top + height, left + 1 : left + width )); 
-hidden_img = normalise(hidden_img);​ 
-</​code>​ 
- 
- 
-</​note>​ 
-</​hidden>​ 
- 
- 
-<​hidden> ​ 
-<​note>​ 
-Doar pentru asistenți. Formam imagine steno. 
-<code matlab lab10_ex2.m>​ 
-clear all 
-close all 
- 
-height0 ​ = 240; 
-width0 ​  = 320; 
- 
-height ​ = 1 * height0; 
-width   = 1 * width0; 
-%% pregatirea datelor 
-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_gray = double(rgb2gray(img)) / 255; 
-h = figure , imshow(img_gray) 
-title('​imagine originala in gri') 
- 
-%citim imaginea secreta si o convertim in gri 
-hid_img = imread('​dog.jpeg'​);​ 
-hid_img = imresize(hid_img,​ [height,​width]);​ 
-hid_img = double(rgb2gray(hid_img)) / 255; 
- 
-stego = encode_hidden_image(img_gray,​ hid_img); 
-figure, imshow(stego) 
-filename = '​stego_img.bmp'​ 
-% salvam ca bmp, lossless astfel incât sa nu avem zgomot care ne-ar 
-% ingreuna recuperarea imaginii ascunse. Astfel avem agomot doar de 
-% cuantizare a valorilor pixelilor dar nu si de la algoritmul de compresie 
-imwrite(stego,​filename,'​bmp'​);​ 
-%% decodificarea 
- 
-stego_bmp = imread(filename);​ 
-hid = decode_stegano_image(stego_bmp);​ 
- 
- 
-figure, imshow(hid);​impixelinfo 
-title('​imagine ascunsă recuperată din imaginea bmp stego ') 
- 
-</​code>​ 
-</​note>​ 
- 
-<​note>​ 
-<code matlab normalise.m>​ 
-function img = normalise(img) 
-img = (img - min(img(:)) ) ./ (max(img(:​)) - min(img(:​))) ; 
-</​code>​ 
-</​note>​ 
-</​hidden> ​ 
- 
  
  
Line 167: Line 49:
   - trebuie să înlocuiți modulul (atenție: doar modulul nu și faza) spectrului din zona selectată cu valorile imaginii secrete. Intâi calculăm media valorilor spectrului din zona dorită, apoi înlocuim valorile din zonă cu valorile imaginii secrete scalate (de 2-10 ori mai mari decât media: ex. inmulțite cu media x 5).   - trebuie să înlocuiți modulul (atenție: doar modulul nu și faza) spectrului din zona selectată cu valorile imaginii secrete. Intâi calculăm media valorilor spectrului din zona dorită, apoi înlocuim valorile din zonă cu valorile imaginii secrete scalate (de 2-10 ori mai mari decât media: ex. inmulțite cu media x 5).
   - vrem să trecem acest spectru înapoi în domeniul timp (de fapt este domeniu spațial, dar îl denumim domeniu timp doar ca să păstrăm terminologia de până acum:  domeniu timp --> FFT --> domeniul spectral și invers).   - vrem să trecem acest spectru înapoi în domeniul timp (de fapt este domeniu spațial, dar îl denumim domeniu timp doar ca să păstrăm terminologia de până acum:  domeniu timp --> FFT --> domeniul spectral și invers).
-  - 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 să avem proprietatea |S(-k)| = |S(k)|. Pentru aceasta trebuie să avem un spectru care este simetric față de jumătatea spectrului atât vertical cât și orizontal.+  - 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 să avem proprietatea |S(-k)| = |S(k)|. Pentru aceasta trebuie să avem un spectru care este simetric față de jumătatea spectrului atât vertical cât și orizontal. Spectrul final trebuie sa arate asemănător cu spectrul de mai jos.
   - creați spectrul simetric și treceți în domeniul timp (spațial) cu '​ifft2'​.   - creați spectrul simetric și treceți în domeniul timp (spațial) cu '​ifft2'​.
   - afisați imaginea stego - această imaginea ar trebui să fie insesizabil diferită față de imaginea originală.   - afisați imaginea stego - această imaginea ar trebui să fie insesizabil diferită față de imaginea originală.
   - extrageți imaginea secretă folosind funcția scrisă la exercițiul 2.   - extrageți imaginea secretă folosind funcția scrisă la exercițiul 2.
  
- <​hidden>​ +{{:ps:laboratoare:lab10_ps_stego_spectru.png?300|}}
- +
-<​note>​ +
-<code matlab encode_hidden_image.m>​ +
-     +
-function steno_img = encode_hidden_image(carrier_img,​ hidden_img) +
-% punem in modului spectrului imaginea ascunsa +
-% imaginea secreta o ascundem in frecventele inalte ale imaginii +
- +
- +
-top     = 100; +
-left    = 100; +
-[height, width] = size(hidden_img);​ +
- +
-S = fft2(carrier_img);​ +
-phase_S = S ./ abs(S); +
- +
-abs_S = abs(S); +
-% calculam media spectrului pe zona pe care o vom inlocui, +
-% astfel incat media pe acea zona sa ramana aproximativ constanta +
-patch = abs_S(top+1:​ top + height, left + 1 : left + width); +
-max_S = 5 * mean(patch(:​));​ +
- +
-[st_h, st_w] = size(abs_S) ; +
- +
-abs_S(top+1:​ top + height, left + 1 : left + width  ) = max_S * hidden_img;​ +
-abs_S(top+1:​ top + height, st_w - left + 2 - width: st_w - left + 1  ) = max_S * hidden_img(:,​end:​-1:​1);​ +
- +
-abs_S(st_h - top + 2 - height : st_h - top + 1, left + 1 : left + width) = max_S * hidden_img(end:​-1:​1,:​);​ +
-abs_S(st_h - top + 2 - height : st_h - top + 1, st_w - left + 2 - width: st_w - left + 1) = max_S * hidden_img(end:​-1:1,end:-1:1); +
- +
-% figure, imagesc(log(abs_S));​impixelinfo +
-% title('​spectru imagini stego'​) +
- +
-steno_img = ifft2(abs_S ​.* phase_S); +
- +
-</​code>​ +
-</​note>​+
  
-</​hidden> ​ 
  
 === Exercițiul 4 -- Codificarea unei imagini secrete, gri în spectrul unui imagini color [1p] === === Exercițiul 4 -- Codificarea unei imagini secrete, gri în spectrul unui imagini color [1p] ===
Line 293: Line 137:
   * Responsabil:​ [[andrei.nicolicioiu@gmail.com|Andrei Nicolicioiu]]   * Responsabil:​ [[andrei.nicolicioiu@gmail.com|Andrei Nicolicioiu]]
  
-  * Data publicării:​ 02.12.2018+  * Data publicării:​ 02.12.2019
    
 /* </​hidden>​ */ /* </​hidden>​ */
  
ps/laboratoare/10_2.1543830388.txt.gz · Last modified: 2018/12/03 11:46 by ionut.gorgos
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