Skip to content

Commit

Permalink
all in ENG
Browse files Browse the repository at this point in the history
  • Loading branch information
etfovac committed Aug 14, 2020
1 parent c8e615a commit 1c22679
Show file tree
Hide file tree
Showing 15 changed files with 220 additions and 228 deletions.
47 changes: 23 additions & 24 deletions Main.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
% Unmarked image has to be grayscale. If a color image is selected,
% it is coverted into grayscale image.

global K block_dim Level faktor Vs Ss vis_wmarka sir_wmarka
global K block_dim Level factor Vs Ss hdim_wmark wdim_wmark
% TODO: Get rid of globals
output_folder = 'output\\';
step = 0;
Expand Down Expand Up @@ -43,13 +43,13 @@
% Enter intensity/grayscale image
end
figure(1), imshow(Unmarked_image), title('Unmarked image')
[Image, Vs, Ss] = podes_slike(Unmarked_image);
faktor = norm_faktor(Image);
Image = double(Image)/faktor;
% Dimenzije watermarka
vis_wmarka = Vs/block_dim;
sir_wmarka = Ss/block_dim;
vel_wmarka = vis_wmarka * sir_wmarka;
[Image, Vs, Ss] = adj_image(Unmarked_image, block_dim);
factor = norm_factor(Image);
Image = double(Image)/factor;
% Watermark dimensions
hdim_wmark = Vs/block_dim;
wdim_wmark = Ss/block_dim;
hw_wmark = hdim_wmark * wdim_wmark;
end

% 2. Read watermark (binary image with pixels 0 or 1) ---------------------------------
Expand Down Expand Up @@ -90,21 +90,21 @@
% MATLAB PSS generator is set to init state def by the key
rng(key);
% PSS Permute the watermark
a1 = randperm(vel_wmarka);
a1 = randperm(hw_wmark);
clear key; % delete key
a2 = reshape(a1, vis_wmarka, sir_wmarka);
a2 = reshape(a1, hdim_wmark, wdim_wmark);
skrembl_wmark = watermark(a2);
skrembl_wmark1 = (skrembl_wmark - 0.5)/0.5; % -1 i 1
% skrembl_wmark1 is type double
if method == 1
Marked_image = ugradnja_DCT(Image, skrembl_wmark1);
Marked_image = embed_DCT(Image, skrembl_wmark1, block_dim, K);
elseif method == 2
Marked_image = ugradnja_DWT(Image, skrembl_wmark1);
Marked_image = embed_DWT(Image, skrembl_wmark1, Level, K);
else
error('\n Error. Unsupported method.');
end
figure(5), imshow(Marked_image), title('Marked image')
Marked_image_uint8 = uint8(Marked_image * faktor);
Marked_image_uint8 = uint8(Marked_image * factor);
imwrite(Marked_image_uint8, 'output\\Marked_image.tif');
end

Expand All @@ -122,11 +122,11 @@
%generates images that start with: JPEG_Mkd_img_
end
if k == 2
attack = brightness(Marked_image, output_folder);
attack = brightness(Marked_image, output_folder, factor);
%generates images that start with: Bright_Mkd_img_
end
if k == 3
attack = contrast(Marked_image, output_folder);
attack = contrast(Marked_image, output_folder, factor);
%generates images that start with: Mcon_Mkd_img_
%generates images that start with: Hcon_Mkd_img_
end
Expand Down Expand Up @@ -156,8 +156,8 @@
disp('Image dimensions have to be MxN pixels.');
Marked_image = rgb2gray(Marked_image); % convert to grayscale
end
faktor = norm_faktor(Marked_image);
Marked_image = double(Marked_image)/faktor;
factor = norm_factor(Marked_image);
Marked_image = double(Marked_image)/factor;
% Dimensions of unmarked and marked image are the same.
figure(6),imshow(Marked_image), title('Marked image (read)')
end
Expand All @@ -169,13 +169,13 @@
%key = input('\n Enter the password: ');
rng(key);
% Undo the permutation of the watermark.
b1 = randperm(vel_wmarka);
b1 = randperm(hw_wmark);
clear key; % delete key
b2 = reshape(b1, vis_wmarka, sir_wmarka);
b2 = reshape(b1, hdim_wmark, wdim_wmark);
if method == 1
recovered_watermark = izdvajanje_DCT(Image, Marked_image, b2);
recovered_watermark = extract_DCT(Image, Marked_image, b2, block_dim, hdim_wmark, wdim_wmark);
elseif method == 2
recovered_watermark = izdvajanje_DWT(Image, Marked_image, b2);
recovered_watermark = extract_DWT(Image, Marked_image, b2, Level, factor, hdim_wmark, wdim_wmark);
else
error('\n Error. Unsupported method.');
end
Expand All @@ -191,9 +191,8 @@
error = abs(recovered_watermark - watermark);
br_pogr_bita = sum(sum(error));
fprintf('\n Num of bit errors in detected watermark %i ', br_pogr_bita)
procenat_pogr_bita = (br_pogr_bita/vel_wmarka)*100;
fprintf('\n BER [%%] for detected watermark %f \n',...
procenat_pogr_bita)
procenat_pogr_bita = (br_pogr_bita/hw_wmark)*100;
fprintf('\n BER [%%] for detected watermark %f \n', procenat_pogr_bita)
disp('*******************************************************')
end
% THE END -----------------------------------------------------
Expand Down
19 changes: 19 additions & 0 deletions adj_image.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
function [Image, Vs, Ss] = adj_image(orig_Image, block_dim)
% Podesavanje dimenzija slike (zero padding)
% Image dimensions
Vor = size(orig_Image, 1); % h
Sor = size(orig_Image, 2); % w
remainder1 = mod(Vor, block_dim);
remainder2 = mod(Sor, block_dim);
if (remainder1 ~= 0) || (remainder2 ~= 0)
Image = padarray(orig_Image, [remainder1, remainder2], 0, 'post');
% Image dimensions
Vs = size(Image, 1);
Ss = size(Image, 2);
fprintf('\n Dimenzije slike su podesene na: %ix%i.', Vs, Ss);
else
Image = orig_Image;
% Image dimensions
Vs = size(Image, 1);
Ss = size(Image, 2);
end
50 changes: 25 additions & 25 deletions adj_wmark.m
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
function zig = adj_wmark(orig_zig)
global vis_ziga sir_ziga
% Dimenzije originalnog ziga
Vz = size(orig_zig,1); % visina
Sz = size(orig_zig,2); % sirina
% Podesavanje dimenzija ziga
zig1 = []; % inicijalizacija
if Vz < vis_ziga
n = floor(vis_ziga/Vz);
function wmark = adj_wmark(w)
global hdim_wmark wdim_wmark
% Dim of original wmark
Vz = size(w,1); % h
Sz = size(w,2); % w
% Adjust wmark dimensions
wmark1 = []; % init
if Vz < hdim_wmark
n = floor(hdim_wmark/Vz);
for i = 1:n
zig1 = [zig1; orig_zig]; % zig se ponavlja po vertikali
wmark1 = [wmark1; w]; % repeat verticaly
end
dopuna = orig_zig(1:mod(vis_ziga,Vz), :);
zig1 = [zig1; dopuna];
filler = w(1:mod(hdim_wmark,Vz), :);
wmark1 = [wmark1; filler];
else
zig1 = orig_zig(1:vis_ziga, :); % odsecanje
wmark1 = w(1:hdim_wmark, :); % crop
end
zig2 = []; % inicijalizacija
if Sz < sir_ziga
m = floor(sir_ziga/Sz);
wmark2 = []; % init
if Sz < wdim_wmark
m = floor(wdim_wmark/Sz);
for j = 1:m
zig2 = [zig2, zig1]; % zig se ponavlja po horizontali
wmark2 = [wmark2, wmark1]; % repeat horizontaly
end
dopuna = zig1(:, 1:mod(sir_ziga,Sz));
zig2 = [zig2, dopuna];
filler = wmark1(:, 1:mod(wdim_wmark,Sz));
wmark2 = [wmark2, filler];
else
zig2 = zig1(:, 1:sir_ziga); % odsecanje
wmark2 = wmark1(:, 1:wdim_wmark); % crop
end
zig = zig2;
if (Vz ~= vis_ziga) || (Sz ~= sir_ziga)
fprintf('\n Dimenzije ziga su podesene na: %ix%i.', ...
vis_ziga, sir_ziga);
imwrite(uint8(zig),'zig.bmp');
wmark = wmark2;
if ((Vz ~= hdim_wmark) || (Sz ~= wdim_wmark))
fprintf('\n Watermark dimensions are set to: %ix%i.', ...
hdim_wmark, wdim_wmark);
imwrite(uint8(wmark),'w.bmp');
end
7 changes: 3 additions & 4 deletions brightness.m
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
function attack = brightness(Marked_image, folder)
global faktor
function attack = brightness(Marked_image, folder, factor)
%-------------------------------------------------------------------------
% Modify brightness
b = [0.1 0.2 0.3 0.4 0.5];
Expand All @@ -9,15 +8,15 @@
iznad1 = find(osv_slika > 1);
osv_slika(iznad1) = ones(size(iznad1));
path = strcat(folder, ['Bright_Mkd_img_',num2str(b(i)),'.tif']);
imwrite(uint8(osv_slika * faktor),path);
imwrite(uint8(osv_slika * factor),path);
end

for i = 1:length(b)
osv_slika = Marked_image - b(i);
ispod1 = find(osv_slika < 0);
osv_slika(ispod1) = zeros(size(ispod1));
path = strcat(folder, ['Bright_Mkd_img_-',num2str(b(i)),'.tif']);
imwrite(uint8(osv_slika * faktor), path);
imwrite(uint8(osv_slika * factor), path);
end

attack = 'An attack by brightness change.';
7 changes: 3 additions & 4 deletions contrast.m
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
function attack = contrast(Marked_image, folder)
global faktor
function attack = contrast(Marked_image, folder, factor)
%-------------------------------------------------------------------------
% Modify contrast
c = [0.5 0.6 0.7 0.9 1.1 1.4 1.5 1.6 1.7 1.8];

for i = 1:length(c)
kon_slika1 = c(i)* Marked_image;
path = strcat(folder, ['Mcon_Mkd_img_',num2str(c(i)),'.tif']);
imwrite(uint8(kon_slika1 * faktor),path);
imwrite(uint8(kon_slika1 * factor),path);
end

bin = [8 16 32 64 96 128 160 192 224 240];

for i = 1:length(bin)
h_kon_slika = histeq(Marked_image, bin(i));
path = strcat(folder, ['Hcon_Mkd_img_',num2str(c(i)),'.tif']);
imwrite(uint8(h_kon_slika * faktor),path);
imwrite(uint8(h_kon_slika * factor),path);
end

attack = 'An attack by contrast change.';
30 changes: 30 additions & 0 deletions embed_DCT.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
function Marked_Image_DCT = embed_DCT(Image, skrembl_zig1, dim_bloka, K)
% Generate Marked_Image_DCT
global Vs Ss
% Middle DCT coeffs range is selected for watermarking
y = 1; n = 1; v = 1; m = 1; d = 0; x = 0;
srednji = [ 0, 0, y, n, v, m, d, x;
0, y, n, v, m, d, x, 0;
y, n, v, m, d, x, 0, 0;
n, v, m, d, x, 0, 0, 0;
v, m, d, x, 0, 0, 0, 0;
m, d, x, 0, 0, 0, 0, 0;
d, x, 0, 0, 0, 0, 0, 0;
x, 0, 0, 0, 0, 0, 0, 0 ];
Marked_Image_DCT = zeros(size(Image)); % init
T = dctmtx(dim_bloka);
z1 = 0; % init
for s1 = 1: dim_bloka: Vs
z1 = z1 + 1;
z2 = 0; % init
for s2 = 1: dim_bloka: Ss
z2 = z2 + 1;
indx1 = s1: s1 + dim_bloka - 1;
indx2 = s2: s2 + dim_bloka - 1;
block = Image(indx1, indx2);
DCT_block = T * block * T'; % output is double type
beleg = K/100 * skrembl_zig1(z1, z2); % skrembl_zig1(z1, z2) is 1 or -1
Zig_DCT_blok = DCT_block + (abs(DCT_block)*beleg).*srednji;
Marked_Image_DCT(indx1, indx2) = T' * Zig_DCT_blok * T; % output is double type
end
end
63 changes: 31 additions & 32 deletions ugradnja_DWT.m → embed_DWT.m
Original file line number Diff line number Diff line change
@@ -1,33 +1,32 @@
function Marked_image = ugradnja_DWT(Image, skrembl_zig1)
% Generisanje slike oznacene koriscenjem Wavelet transformacije-----------
global Level K
% Level = 3
%-------------------------------------------------------------------------
[Image_DWT, bookie] = wavedec2(Image, Level, 'haar');
Marked_Image_DWT = Image_DWT; % init
%-------------------------------------------------------------------------
horiz_detalji3 = wavecopy('h', Image_DWT, bookie, Level);
vert_detalji3 = wavecopy('v', Image_DWT, bookie, Level);
dijag_detalji3 = wavecopy('d', Image_DWT, bookie, Level);
zig_horiz_detalji3 = horiz_detalji3 + K/2/100 * abs(horiz_detalji3).*skrembl_zig1;
zig_vert_detalji3 = vert_detalji3 + K/2/100 * abs(vert_detalji3) .* skrembl_zig1;
zig_dijag_detalji3 = dijag_detalji3 + K/2/100 * abs(dijag_detalji3) .* skrembl_zig1;
%-------------------------------------------------------------------------
Marked_Image_DWT = wavepaste('h', Marked_Image_DWT, bookie, Level, zig_horiz_detalji3);
Marked_Image_DWT = wavepaste('v', Marked_Image_DWT, bookie, Level, zig_vert_detalji3);
Marked_Image_DWT = wavepaste('d', Marked_Image_DWT, bookie, Level, zig_dijag_detalji3);
%-------------------------------------------------------------------------
hor_detailes_2 = wavecopy('h', Image_DWT, bookie, Level-1);
ver_detailes_2 = wavecopy('v', Image_DWT, bookie, Level-1);
dijag_detalji2 = wavecopy('d', Image_DWT, bookie, Level-1);
skrembl_zig2 = repmat(skrembl_zig1, Level - 1);

mkd_hor_detailes_2 = hor_detailes_2 + 2*K/100 * abs(hor_detailes_2).*skrembl_zig2;
mkd_ver_detailes_2 = ver_detailes_2 + 2*K/100 * abs(ver_detailes_2) .* skrembl_zig2;
zig_dijag_detalji2 = dijag_detalji2 + 2*K/100 * abs(dijag_detalji2) .* skrembl_zig2;
%-------------------------------------------------------------------------
Marked_Image_DWT = wavepaste('h', Marked_Image_DWT, bookie, Level-1, mkd_hor_detailes_2);
Marked_Image_DWT = wavepaste('v', Marked_Image_DWT, bookie, Level-1, mkd_ver_detailes_2);
Marked_Image_DWT = wavepaste('d', Marked_Image_DWT, bookie, Level-1, zig_dijag_detalji2);
%-------------------------------------------------------------------------
function Marked_image = embed_DWT(Image, skrembl_zig1, Level, K)
% Generate Marked_Image_DWT
% Level = 3
%-------------------------------------------------------------------------
[Image_DWT, bookie] = wavedec2(Image, Level, 'haar');
Marked_Image_DWT = Image_DWT; % init
%-------------------------------------------------------------------------
horiz_detalji3 = wavecopy('h', Image_DWT, bookie, Level);
vert_detalji3 = wavecopy('v', Image_DWT, bookie, Level);
dijag_detalji3 = wavecopy('d', Image_DWT, bookie, Level);
zig_horiz_detalji3 = horiz_detalji3 + K/2/100 * abs(horiz_detalji3).*skrembl_zig1;
zig_vert_detalji3 = vert_detalji3 + K/2/100 * abs(vert_detalji3) .* skrembl_zig1;
zig_dijag_detalji3 = dijag_detalji3 + K/2/100 * abs(dijag_detalji3) .* skrembl_zig1;
%-------------------------------------------------------------------------
Marked_Image_DWT = wavepaste('h', Marked_Image_DWT, bookie, Level, zig_horiz_detalji3);
Marked_Image_DWT = wavepaste('v', Marked_Image_DWT, bookie, Level, zig_vert_detalji3);
Marked_Image_DWT = wavepaste('d', Marked_Image_DWT, bookie, Level, zig_dijag_detalji3);
%-------------------------------------------------------------------------
hor_detailes_2 = wavecopy('h', Image_DWT, bookie, Level-1);
ver_detailes_2 = wavecopy('v', Image_DWT, bookie, Level-1);
dijag_detalji2 = wavecopy('d', Image_DWT, bookie, Level-1);
skrembl_zig2 = repmat(skrembl_zig1, Level - 1);

mkd_hor_detailes_2 = hor_detailes_2 + 2*K/100 * abs(hor_detailes_2).*skrembl_zig2;
mkd_ver_detailes_2 = ver_detailes_2 + 2*K/100 * abs(ver_detailes_2) .* skrembl_zig2;
zig_dijag_detalji2 = dijag_detalji2 + 2*K/100 * abs(dijag_detalji2) .* skrembl_zig2;
%-------------------------------------------------------------------------
Marked_Image_DWT = wavepaste('h', Marked_Image_DWT, bookie, Level-1, mkd_hor_detailes_2);
Marked_Image_DWT = wavepaste('v', Marked_Image_DWT, bookie, Level-1, mkd_ver_detailes_2);
Marked_Image_DWT = wavepaste('d', Marked_Image_DWT, bookie, Level-1, zig_dijag_detalji2);
%-------------------------------------------------------------------------
Marked_image = waverec2(Marked_Image_DWT, bookie, 'haar');
37 changes: 37 additions & 0 deletions extract_DCT.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
function rec_wmark= extract_DCT(Image, Marked_image, b2, block_dim, hdim_wmark, wdim_wmark)
% Reconstruct wmark
global Vs Ss
%-------------------------------------------------------------------------
y = 1; n = 1; v = 1; m = 1; d = 0; x = 0;
range = [ 0, 0, y, n, v, m, d, x;
0, y, n, v, m, d, x, 0;
y, n, v, m, d, x, 0, 0;
n, v, m, d, x, 0, 0, 0;
v, m, d, x, 0, 0, 0, 0;
m, d, x, 0, 0, 0, 0, 0;
d, x, 0, 0, 0, 0, 0, 0;
x, 0, 0, 0, 0, 0, 0, 0 ];
skrembl_zig = zeros(hdim_wmark,wdim_wmark); % init
T = dctmtx(block_dim);
z1 = 0; % init
for s1 = 1: block_dim: Vs
z1 = z1 + 1;
z2 = 0; % init
for s2 = 1: block_dim: Ss
z2 = z2 + 1;
indeks1 = s1: s1 + block_dim - 1;
indeks2 = s2: s2 + block_dim - 1;
block = Image(indeks1, indeks2);
mkd_block = Marked_image(indeks1, indeks2);
DCT_blok = T * block * T'; % double
DCT_ozn_blok = T * mkd_block * T'; % double
B = (DCT_ozn_blok - DCT_blok) .* range;
if sum(sum(B)) > 0
skrembl_zig(z1, z2)= 1;
else
skrembl_zig(z1, z2)= 0;
end
end
end
rec_wmark = skrembl_zig; % init
rec_wmark(b2) = skrembl_zig;
Loading

0 comments on commit 1c22679

Please sign in to comment.