⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 经典水印算法qim源码.txt

📁 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 + -