comparison Meerwald-dir/frid2_common.c @ 24:9f20bce6184e v0.7

move directories, support netpbm 11
author Peter Meerwald-Stadler <pmeerw@pmeerw.net>
date Fri, 20 Dec 2024 13:08:59 +0100
parents Meerwald/frid2_common.c@bd669312f068
children
comparison
equal deleted inserted replaced
23:71dd4b96221b 24:9f20bce6184e
1 #include "frid2_common.h"
2 #include "signature-utils.h"
3 #include "wm.h"
4
5 extern char *progname;
6
7 void embed_low_freq(double **dcts, int cols, int rows, double alpha, int verbose) {
8 int n;
9 int row, col, dir;
10
11 n = 0;
12 row = col = 0;
13 dir = 1;
14 while (n < nbit_signature) {
15 double d, x;
16 int embed;
17 int out;
18
19 col -= dir;
20 row += dir;
21 if (col < 0) { dir = -1; col = 0; }
22 if (col >= cols) { dir = 1; col = cols - 1; row += 2; }
23 if (row < 0) { dir = 1; row = 0; }
24 if (row >= rows) { dir = -1; row = rows - 1; col += 2; }
25
26 d = dcts[row][col];
27 if (fabs(d) <= 1.0) {
28 if (verbose > 3)
29 fprintf(stderr, "%s: bit #%d - skipped (%d/%d)\n", progname, n, col, row);
30 continue;
31 }
32
33 embed = 2 * get_signature_bit(n) - 1;
34
35 x = (d > 0.0) ? 1.0 : -1.0;
36 out = 1;
37 while (fabs(x) < fabs(d)) {
38 x *= FORWARD_STEP(alpha);
39 out =- out;
40 }
41
42 if (out != embed) {
43 if (fabs(d - x) < fabs(d - x * BACKWARD_STEP(alpha)))
44 x *= FORWARD_STEP(alpha);
45 else
46 x *= BACKWARD_STEP(alpha);
47 }
48
49 d = (x + x * BACKWARD_STEP(alpha)) / 2.0;
50
51 if (verbose > 3)
52 fprintf(stderr, "%s: embedding bit #%d (= %d) at (%d/%d): %f -> %f\n", progname, n, get_signature_bit(n), col, row, dcts[row][col], d);
53
54 dcts[row][col] = d;
55
56 n++;
57 }
58 }
59
60 void embed_med_freq(double **dcts, int cols, int rows, double gamma, int seed, int verbose) {
61 // select mid-frequency (30%) coefficients
62 int start = (int) (0.35 * rows * cols + 0.5);
63 int end = (int) (0.65 * rows * cols + 0.5);
64
65 double *vector;
66 int x = 0, y = 0, dir = 1;
67 int i, j;
68
69 vector = malloc((end - start) * sizeof(double));
70 for (i = 0; i < (end - start); i++)
71 vector[i] = 0.0;
72
73 // create pseudo-random vector
74 srandom(seed);
75 for (i = 0; i < nbit_signature; i++) {
76 if (get_signature_bit(i))
77 random();
78 for (j = 0; j < (end - start); j++)
79 vector[j] += (double) (random() & RAND_MAX) / (double) RAND_MAX - 0.5;
80 if (!get_signature_bit(i))
81 random();
82 }
83
84 for (i = 0; i < (end - start); i++)
85 vector[i] /= sqrt(nbit_signature);
86
87 for (i = 0; i < end; i++) {
88 // zig-zag scan
89 x -= dir;
90 y += dir;
91 if (x < 0) { dir = -1; x = 0; }
92 if (x >= cols) { dir = 1; x = cols - 1; y += 2; }
93 if (y < 0) { dir = 1; y = 0; }
94 if (y >= rows) { dir = -1; y = rows - 1; x += 2; }
95
96 // embed vector
97 if ((i - start) >= 0) {
98 // fprintf(stderr, "%d/%d: %f -> %f\n", x, y, dcts[y][x], dcts[y][x] + gamma * vector[i - start]);
99 dcts[y][x] += gamma * vector[i - start];
100 }
101 }
102
103 free(vector);
104 }
105
106 double detect_low_freq(double **dcts, int cols, int rows, double alpha, double beta, int verbose) {
107 int n;
108 int row, col, dir;
109 double sum1, sum2;
110
111 n = 0;
112 row = col = 0;
113 dir = 1;
114 sum1 = sum2 = 0.0;
115 while (n < nbit_signature1) {
116 double d, x;
117 int detect;
118 int out;
119
120 col -= dir;
121 row += dir;
122 if (col < 0) { dir = -1; col = 0; }
123 if (col >= cols) { dir = 1; col = cols - 1; row += 2; }
124 if (row < 0) { dir = 1; row = 0; }
125 if (row >= rows) { dir = -1; row = rows - 1; col += 2; }
126
127 d = dcts[row][col];
128 if (fabs(d) <= 1.0) {
129 if (verbose > 3)
130 fprintf(stderr, "%s: bit #%d - skipped (%d/%d)\n", progname, n, col, row);
131 continue;
132 }
133
134 detect = 2 * get_signature1_bit(n) - 1;
135
136 x = (d > 0.0) ? 1.0 : -1.0;
137 out = 1;
138 while (fabs(x) < fabs(d)) {
139 x *= FORWARD_STEP(alpha);
140 out =- out;
141 }
142
143 if (verbose > 3)
144 fprintf(stderr, "%s: detected bit #%d (= %d) at (%d/%d): %f\n", progname, n, out > 0 ? 1 : 0, col, row, d);
145
146 set_signature2_bit(n, out > 0 ? 1 : 0);
147 sum1 += pow(fabs(d), beta) * out * detect;
148 sum2 += pow(fabs(d), beta);
149
150 n++;
151 }
152
153 return sum1 / sum2;
154 }
155
156 double detect_med_freq(double **dcts, int cols, int rows, int seed, int verbose) {
157 int i, j, k;
158 int start= (int) (0.35 * rows * cols + 0.5);
159 int end = (int) (.65 * rows * cols + 0.5);
160
161 int sum, sum1, sum2;
162 int x = 0, y = 0, dir = 1;
163 double *vector;
164 int startx, starty, startdir;
165 double corr[2];
166 double correlation;
167
168 // locate start positions
169 for (i = 0; i < start; i++) {
170 x -= dir;
171 y += dir;
172 if (x < 0) { dir = -1; x = 0; }
173 if (x >= cols) { dir = 1; x = cols - 1; y += 2; }
174 if (y < 0) { dir = 1; y = 0; }
175 if (y >= rows) { dir = -1; y = rows - 1; x += 2; }
176 }
177
178 // save start positions
179 startx = x;
180 starty = y;
181 startdir = dir;
182 srandom(seed);
183
184 vector = malloc((end - start) * sizeof(double));
185
186 for (i = 0; i < nbit_signature1; i++) {
187
188 for (j = 0; j <= (end - start); j++)
189 vector[j] = (double) (random() & RAND_MAX) / (double) RAND_MAX - 0.5;
190
191 for (j = 0; j <= 1; j++) {
192 x = startx;
193 y = starty;
194 dir = startdir;
195 corr[j] = 0;
196
197 for (k = 0; start + k < end; k++) {
198 x -= dir;
199 y += dir;
200 if (x < 0) { dir = -1; x = 0; }
201 if (x >= cols) { dir = 1; x = cols - 1; y += 2; }
202 if (y < 0) { dir = 1; y = 0; }
203 if (y >= rows) { dir = -1; y = rows - 1; x += 2; }
204 corr[j] += dcts[y][x] * vector[k + j];
205 }
206 }
207
208 set_signature2_bit(i, (corr[0] >= corr[1]) ? 0 : 1);
209 }
210
211 sum = 0; sum1 = 0; sum2 = 0;
212 for (i = 0; i < nbit_signature1; i++) {
213 sum += get_signature1_bit(i) * get_signature2_bit(i);
214 sum1 += get_signature1_bit(i) * get_signature1_bit(i);
215 sum2 += get_signature2_bit(i) * get_signature2_bit(i);
216 }
217 correlation = (double) sum / (sqrt(sum1) * sqrt(sum2));
218
219 return correlation;
220 }

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.