未分类

鲁棒性水印

鲁棒性水印

1563795944444

m是我们要添加的水印信息
f(x,y)是原图数组
BCH为一种编码方法,可以同时多位纠错
DSSS为直接序列扩频,减少一位出错的影响
iterleaving为置乱码,防止错误集中在同一块
DWT为离散小波变换
T为训练集,用来防裁剪变换
IDWT为离散小波变换逆变换
DFT为傅里叶变换
template embeding为模板植入,用来放旋转变换
IDFT为傅里叶变换逆变换
f‘’(x,y)为生成的添加水印的图

首先为啥要用离散小波变换呢,因为离散小波变换可以同时保留时频信息,而傅里叶变换只能保留频率信息,也就是说,两张看起来完全不同的图,但是它们的频率信息时一样的,傅里叶变换之后得到的图也是一样的。但是离散小波变换呢,为了方便理解,可以大致理解为以小波为基向量的向量矩阵,同时保留了频域性质和空间性质,因此可以用来添加水印。(以上都是瞎猜的,数学知识不到家,大家别笑)。

对于水印信息,首先为了纠错,要先BCH编码,BCH编码的优点在于可以同时纠错多位,这个就比hamming码nb多了,汉明码只能纠错一位,为了增加可靠度,我们这里采用4位一编码,由4位bch编码成7位。

DSSS编码呢,这个是为了防止单个出错,我们人为扩充编码位数,比如1编码成111,0编码成000,这样一位出错就不会造成太大影响。

interleaving为置乱码,这个编码的主要目的是打乱原先的编码,主要是防同一块出现问题,比如说,某一小块出现溢出问题,在这一小块内,出现的错误过多直接导致之前的纠错码不能纠错,这时候如果使用置乱码,就可以将出错的点打乱,分散开来最终能够使用纠错手段纠错。

在傅里叶变换中,如果将图像旋转,对应的频域图也会旋转,所以可以通过在频域中以特定的方式加上一组向量,最后通过判断向量旋转的角度来将图像旋转回来。这个特定的方式就是,在频域图中按照特定的角度取两条线(这个角度自己定),在这两条线上取点,取点方式为将固定间隔的点的频率改成我们规定的值,方便后面解码的时候检测(由于博主懒,技术实力有限,这个还没有做)。

同样没做的还有一个训练序列,那个原理没咋看懂,这里就不说了。

代码有4个版本,所有的版本都有添加的是一个100位水印,但是我们这里需要的是64位水印,所以在解码的时候限制只输出64位水印。每个版本的编码都是dwt_test_2_1.cpp 解码都是 dwt_test_3.cpp 编码直接运行bash encode.sh就可以,解码运行 bash decode.sh。就可以编译源文件。(默认的水印前两位为0x,这个不算在64位里面)

第一个版本是encode,这个版本完全按照论文来,波形选的bior4.4,因为没找到论文上写的那个波形。在小波变换的同时直接将后面的添加水印一起写了。没有防止鲁棒性的功能,可以添加水印解码水印,对图片大小的要求最小为 1024*1024。

第二个版本为encode_2_2,这个版本将水印添加了4遍,分了4个块,每个块添加完全一样的一份,最后4个每一位投票选出每一位正确的那个。这个对图片的大小要求为最小1800*1800(虽然这个理论看上去好像很正确,但是估计是博主的写法除了问题,出问题喜欢同时出现,这样就失去了4选1的意义)。

第三个版本为encode_3_3,这个版本水印加了9遍,分了9个块,图片最小为2700*2700,其他和第二个版本一样。(也会出同样的问题)

第四个版本为encode_raid,版本将水印添加了8遍,但是添加的方式不一样,首先,将第一个块的全部添加前8位,添加8遍(就是将原来完整的64位水印替换成由前8位拼成的64位字符串),第二块以此类推。解码的时候8选一。

 

运行代码前要先配环境 sudo apt install libopencv-dev libfftw3-dev

这个是原文:
Kang et al. – 2003 – A DWT-DFT composite watermarking scheme robust to

原始版本添加水印:
encode

4选一水印:
encode_2_2

9选一水印:
encode_3_3

raid水印(能写64个字符):
encode_raid

扩充字符后的raid水印(上面那个只能写0-9,a-f,现在能写0-9,a-z,A-Z,以及’:”?’,能写64个字符):
fan_star_encode
fan_star_decode
(ps:以上两个代码,只在windows下测试过,linux下运行的时候还需要调整下)

Leave a Reply

邮箱地址不会被公开。 必填项已用*标注