-
Notifications
You must be signed in to change notification settings - Fork 1
/
extract.m
152 lines (151 loc) · 4.4 KB
/
extract.m
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
function [ data,img_reconstructed ] = extract(embaded)
%EXTRACT 此处显示有关此函数的摘要
% 此处显示详细说明
LS = liftwave('cdf2.2','Int2Int');
[CA,CH,CV,CD] = lwt2(embaded,LS);
[~,wori] = size(CH);
mat_merged = [CH,CV,CD];
Tembaded = 3;
% figure,histogram(mat_merged,'BinWidth',1)
S = find_s(mat_merged);
if(S == 99999)
disp('error cannot find start sequence.')
return
end
mat_merged = clear_start_mark(mat_merged,S);
Peak = S;
data = [];
bit_extracted = 0;
while(1)
% figure,histogram(mat_merged,'BinWidth',1)
[ mat_merged,bit_ret,bit_extracted] = extract_one_shift(mat_merged,Peak,bit_extracted);
data = [bit_ret,data];
[mat_merged,~] = shift_hist_reverse(mat_merged,Peak);
if(Peak == Tembaded)
break;
end
if(Peak > 0)
Peak = -1*Peak - 1;
else
Peak = -1*Peak;
end
end
data = buff2_str(data,length(data));
CH = mat_merged(:,1:wori);
CV = mat_merged(:,wori+1:2*wori);
CD = mat_merged(:,2*wori+1:end);
img_reconstructed = ilwt2(CA,CH,CV,CD,LS);
end
function [ mat_emb,bit_seq_ret,bit_extracted ] = extract_one_shift(mat_emb,Z,bit_extracted)
[h,w] = size(mat_emb);
buff = zeros(1,h*w);
bit1_cont = 0;
endloop = 0;
buff_idx = 1;
cnt = 0;
for ii = 1:h
for jj = 1:w
if(mat_emb(ii,jj) == Z+sign(Z) || mat_emb(ii,jj) == Z)
if(cnt >= 64)
if(mat_emb(ii,jj) == Z+sign(Z))
bit = 1;
mat_emb(ii,jj) = Z;
bit1_cont = bit1_cont + 1;
elseif(mat_emb(ii,jj) == Z)
bit = 0;
bit1_cont = 0;
end
buff(buff_idx) = bit;
buff_idx = buff_idx + 1;
if(bit1_cont >= 32)
endloop = 1;
end
end
cnt = cnt + 1;
end
if(endloop == 1)
break;
end
end
if(endloop == 1)
break;
end
end
bit_extracted = bit_extracted + buff_idx - 1;
bit_seq_ret = buff(1:buff_idx-1);
% str_ret = buff2_str(buff,buffidx);
end
function [ str_ret ] = buff2_str(buff,len)
double_ret = linspace(0,0,len/8);
double_idx = 1;
double_value = 0;
bit_idx = 0;
for ii = 1:len
double_value = double_value * 2 + buff(ii);
bit_idx = bit_idx + 1;
if(bit_idx == 16)
if(double_value == 65535)
break;
end
double_ret(double_idx) = double_value;
double_value = 0;
double_idx = double_idx + 1;
bit_idx = 0;
end
end
str_ret = char(double_ret);
end
function [S] = find_s(mat_emb)
for Z=-30:30
if_start = if_start_here(mat_emb,Z);
if(if_start == 1)
S = Z;
break
end
end
end
function [if_start] = if_start_here(mat_emb,Z)
if_start = 9999999;
cnt = 0;
next_should = 1;
[h,w] = size(mat_emb);
for ii = 1:h
for jj = 1:w
if(mat_emb(ii,jj) == Z+sign(Z) || mat_emb(ii,jj) == Z)
if(mat_emb(ii,jj) == Z+sign(Z))
bit = 0;
elseif(mat_emb(ii,jj) == Z)
bit = 1;
end
if(bit ~= next_should)
return
else
next_should = ~next_should;
end
cnt = cnt + 1;
if(cnt == 16)
if_start = 1;
return
end
end
end
end
end
function [mat_emb] = clear_start_mark(mat_emb,Z)
cnt = 0;
[h,w] = size(mat_emb);
for ii = 1:h
for jj = 1:w
if(mat_emb(ii,jj) == Z+sign(Z) || mat_emb(ii,jj) == Z)
if(mat_emb(ii,jj) == Z+sign(Z))
mat_emb(ii,jj) = Z;
elseif(mat_emb(ii,jj) == Z)
end
cnt = cnt + 1;
if(cnt == 64)
return
end
end
end
end
end