This shows you the differences between two versions of the page.
ps:laboratoare:10_2 [2018/12/05 11:39] andrei.nicolicioiu |
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 174: | Line 56: | ||
{{:ps:laboratoare:lab10_ps_stego_spectru.png?300|}} | {{:ps:laboratoare:lab10_ps_stego_spectru.png?300|}} | ||
- | <hidden> | ||
- | |||
- | <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 295: | 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> */ | ||