?? 經典水印算法qim源碼.txt
字號:
#include <stdlib.h>#include <stdio.h>#include <math.h>double quantize(double value, double delta) { int q = rint(value / delta); if ((value - delta * q) <= (delta * (q + 1) - value)) return delta * q; else return delta * (q + 1);}void quantize_vector(double s[], double x[], double dither[], double delta, int n) { int i; for (i = 0; i < n; i++) s[i] = quantize(x[i] + dither[i], delta) - dither[i];}void print_vector(double x[], int n) { int i; for (i = 0; i < n; i++) printf("%.2f ", x[i]); printf("\n");}void print_bits(char x[], int n) { int i; for (i = 0; i < n; i++) printf("%c", x[i] ? '1' : '0'); printf("\n");}double sqr(double x) { return x * x;}double distance(double y[], double dither[], double delta, int n) { int i; double sum = 0.0; for (i = 0; i < n; i++) sum += sqr(y[i] - (quantize(y[i] + dither[i], delta) - dither[i])); return sum;}int decode_vector(double y[], double **dither, double delta, int l) { return (distance(y, dither[0], delta, l) < distance(y, dither[1], delta, l)) ? 0 : 1;}int main(int argc, char *argv[]) { double *s, *x, *y; double delta, delta2; double **dither; int n; int i; int nbits; char *bits, *bits2; int l; srandom(1234); delta = 10.0; delta2 = delta / 2.0; nbits = 10000; bits = malloc(nbits * sizeof(char)); bits2 = malloc(nbits * sizeof(char)); for (i = 0; i < nbits; i++) { bits[i] = (random() > RAND_MAX / 2) ? 0 : 1; bits2[i] = 0; } printf("original bits\n"); print_bits(bits, nbits); l = 140; dither = malloc(2 * sizeof(double *)); dither[0] = malloc(l * sizeof(double)); dither[1] = malloc(l * sizeof(double)); for (i = 0; i < l; i++) { dither[0][i] = (random() / (double) RAND_MAX) * delta - delta2; if (dither[0][i] < 0.0) dither[1][i] = dither[0][i] + delta2; else dither[1][i] = dither[0][i] - delta2; } printf("dither 0\n"); print_vector(dither[0], l); printf("dither 1\n"); print_vector(dither[1], l); n = l * nbits; s = malloc(n * sizeof(double)); x = malloc(n * sizeof(double)); y = malloc(n * sizeof(double)); for (i = 0; i < n; i++) { x[i] = (random() / (double) RAND_MAX) * 255.0; s[i] = 0.0; y[i] = 0.0; } printf("original\n"); print_vector(x, n); for (i = 0; i < nbits; i++) { int bit = bits[i]; quantize_vector(s + l*i, x + l*i, dither[bit], delta, l); } printf("watermarked\n"); print_vector(s, n); for (i = 0; i < n; i++) { y[i] = s[i] + 5 * ((random() / (double) RAND_MAX) - 0.5); } printf("attacked\n"); print_vector(y, n); for (i = 0; i < n; i++) { if (i > 200 && i < 300) y[i] = 0; } printf("zeroed\n"); print_vector(y, n); for (i = 0; i < nbits; i++) { bits2[i] = decode_vector(y + l*i, dither, delta, l); } printf("decoded bits\n"); print_bits(bits2, nbits); for (i = 0; i < nbits; i++) if (bits[i] != bits2[i]) printf("error bit #%d\n", i); exit(0);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -