抗打印的水印算法

抗打印水印算法

以下是余下全文

一、算法的思想

主要思想:周期图像的自相关函数,水印信息实际上是角度

1.嵌入水印思想:将一个有周期性并且有角度的随机块嵌入到图像中。
举个例子:
现有28*7的随机矩阵,之后将此矩阵不断重复知道能够覆盖图像,之后按照一个角度(实际上就是我们的水印信息)将此随机矩阵旋转,最后嵌入到原图像中。
这时候,可能有人会问,这么简单粗暴的将水印嵌入图像中,不是将原来图像的信息给覆盖了吗?不要急,我们之后会提到如何解决此问题(主要引入一个JND概念)。

2.提取水印的思想:将加水印图像的噪声提取出来,之后将“噪声”做自相关,最后通过hough直线检测就能将我们的角度提取出来。
注意点:
一开始读论文的时候,我一直不能理解为什么将嵌入水印的图像自相关之后就能得到结果,此时加水印的图像不是周期图像。
后来我才明白其实可以简单理解为加入的水印其实就是噪声,我们其实提取的是加水印图像的噪声。

二、算法的详细步骤

1.嵌入水印(随机块旋转指定角度,嵌入图像)

1) RGB图像转化为YCbCr图像,之后提取Y分量,之后都是对Y分量操作的。
2) 预处理,为了破坏原图像存在的周期性。
3) 提取图像的JND,JND可以简单理解为像素点能让人眼识别不出最大的阈值。
4) 将图像分成九块,八块嵌入水印信息,一块是参考块。
5) 随机产生26个随机{0,1}集合,之后进行汉明码编码产生32位水印信息。并且以四位计算出一个角度,一共有八个角度。
6) 随机产生28*7随机块,不断重复随机块,直到能覆盖图像块,之后按照步骤(5)产生的角度进行旋转。
7) 旋转之后的随机块,同时结合JND,嵌入到原图像块中。

2.提取水印:

1) 原图像减去维纳滤波之后的图像,得到的就是我们嵌入的信息。
2) 将图像分成九块,分块操作。
3) 对图像每块进行自相关,然后进行高斯变换去噪。
4) 对步骤(3)得到的矩阵,提取峰值。
5) 通过hough直线检测,检测到直线的角度
6) 将步骤(5)得到的角度,转换为二进制信息,之后再通过汉明码检错得到水印信息。

三、算法的实现

嵌入水印过程
原图像:

图像的JND:

嵌入的随机矩阵:

嵌入水印图像:

打印之后,相机拍摄的图像:

提取水印过程
自相关之后的矩阵,从图中看出极值点是在几条平行的直线上

提取极值点之后的图像,从图中能够看到直线

提取水印效果:

提取出的32位中出现了两位的错误,也就是检测九块中出错了一块。

四、参考文献

Toward an interactive poster using digital watermarking and a mobile phone camera

五、代码下载

你可能感兴趣的:(机器学习)