写本文的目的是记录自己学习过或做过的一些东西,深化理解,理清思路,便于回忆。本人处于学习阶段,欢迎指出不对的地方。
数字水印将标识信息直接嵌入数字载体,而不影响原载体的使用价值,使用者不易察觉但可以被生产方识别和辨认,可以保护信息安全,实现防伪溯源,也是信息隐藏技术的研究领域之一。
LSB(least significant bits)是最为简单的数字水印制造方法,可以保证水印不被使用人所见,但可以被制造者辨认。
算法原理
通俗来讲我们看到的图片都是由一个个小的像素点来构成的,所有像素点摆在一起,构成一个大方块,这个大方块就是我们所见的图像。灰度图像(也就是我们平时所说的黑白图像)是由一层像素点组成的,而彩色图像是由三层这样的灰度图像组成的。这里拿灰度图像举例,我们之所以能在图像上看到黑色和白色,是因为每个像素点的像素值不同。0表示纯黑,255表示纯白,灰色就是由这两个数字之间的值构成。越靠近0越黑,越靠近255越白。那为什么是0和255呢?因为计算机是二进制,它会用8个比特来表示一个像素点(也可以用更多的比特,这样图像的颜色分级就越多,同时图像也会占用更大的空间,但是普通人的眼睛并不能辨认这么多的颜色,除非你异于常人),所以最大值是255,最小是0。lsb就是基于2进制这一特点来隐藏信息的,因为人眼并不是很精密的颜色或亮度的感知器,所以把像素灰度上下微调1是不会被人眼察觉的,也就是修改8位二进制码中最小的一位。当我们把图片每个像素的最后一位按照我们的想法改变,使他表现为我们想要的信息,但用户却不能看出,也不会影响图片的内容。这就是lsb数字水印。
开始测试
首先引入一张灰度图像
接下来要做的是提取出所有像素的最后一位,提取的方法有很多,这里采用的是判断像素值奇偶的方法,如果像素值是奇数,那么它的二进制码最低位肯定是1,偶数则相反。通过逐一比对生成如下图像。
这是一副不规则的图像,我们的目的就是把我们要的信息嵌入到这个图像中。下面是我们要嵌入的水印(我把他反色了)
lsb是对图像最后一位进行操作,所以直接把水印加上去就好了,我们要加的水印是个二值图像,所以可以将原始图像的二进制最低位与水印图像进行比对,相同则不变,不同则取反,全部都可以通过for循环完成。
其实如果要储存更多的信息,可以试着将原始图像二进制最后两位都改成水印位,对原始图像的灰度损失也只为3/255,尝试了一下也是基本看不出来的,但可存储的信息由每像素两bits变为每像素4bits,可谓大大增加。
使用指定像素替换是对图像伤害最小的办法(虽然都看不出来),你也可以去掉边框,只把水印放上去,那样伤害是最小的,我比较懒所以没做。下面我们来看看效果
再来个未加水印的原始图像对比一下
是不是没什么区别呢,我们再用之前那个提取像素最后一比特的方法,对得到的图像提取,来看看能提取出什么
总结
这次对灰度图像进行的数字水印添加与检测,对于彩色图像(RGB图像)而言,数字水印的添加方式就比灰度图像多一些,但是原理相类似。可以在一个颜色分层上添加,也可以在三个分层上都添加,也可以利用三个分层的重叠结构存储更多的信息。
需要matlab代码,关注vx公众号:快学图像处理 ,回复LSB即可。
有问题也可以后台问我,看到就解答