简单的程序猿表白 图片隐写 --颜色通道的微改

来源:互联网 发布:淘宝精华帖子 编辑:程序博客网 时间:2024/05/16 15:49

参考博客:https://www.cnblogs.com/taceywong/p/4858933.html

今天这里小编介绍一种简单的属于我们程序猿的表白方式 --图片隐写。

图片的隐写术有很多种,像文件尾添加文件,LSB隐写算法……这些都是比较常见的方法,

图片隐写有什么用呢?图片本身的作用是通过图像传递信息,但是图片本身是一种文件,在这个特定的文件中我们可以在其中隐藏信息,也可以将其作为签名,毕竟现实中照片我们可以背面签名,而计算机中图片可有着无数种“背面”,给了我们签名留下了很大的空间

这里小编介绍一种简单的图片隐写方法,这种隐写方法用到的主要原理也是和我们视觉有关的。


那么这里小编给出一个矩形,如果这里小编问大家这个矩形是什么颜色的,那么大家的说法肯定会非常一致,“黑色”。

其实不然……

这里的这个矩形其实是由无数种颜色组合在了一起,但是由于这些像素点上的颜色差异很低,所以其实在大家眼里这就是一种颜色“黑色”。

在计算机中,颜色可以用三原色调出来,也就是我们熟知的RGB(红色,绿色,蓝色),我们可以用着三原色的值来表示所有的颜色RGB值的范围都是0~255(R:0 G:0 B:0为黑色,R:255 G:255 B:255为白色)。

当我们将这种表示方式的其中一个值改动1的话,其实我们眼睛是分不出来的。

那么到这里跟我们这种隐写方法有没有什么关系呢?

有的,其实原理的重点就是微小改动值我们眼睛不会发现什么异常。

好,介绍完原理,我们开始实际操作。

第一步,搞到一张BMP格式的图片:

为什么是BMP格式的呢?为什么不用我们常见的JPG和PNG格式的呢?

这里还是要介绍一下BMP格式,BMP的全称是BitMap,这种格式的图片是Windows操作系统下的标准图像文件格式,它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此这种格式的图片可能会比较大,但是不压缩这个特性对我们来说很关键。这样我们就可以精确的控制像素值,但是其他格式的图片,如JPG、PNG,都会进行压缩,使得像素值会有比较小的波动,有波动我们就不方便去操作了,所以这里最好还是用BMP格式的。

这里小编际操作了一下,找自己喜欢了很久的一个女生要了一张照片,哎,吐槽一句,本来我还想的是要一张原图,然后靠着自己精湛的技术P好看一点,然后再用隐写方法夸她两句,然而这个女生蠢的一逼,居然不知道怎么发文件(/= _ =)/~┴┴,没办法,只好在她qq空间里面拉了一张被压缩过的噪点满满的照片,打开一看,这么糊怎么P,哎,绕过第一步,直接隐写吧(表白吧)……


我们先将这个图片的数据矩阵读出来。这里提出一种很好的区分方法,我们将所有的像素点的R值(这里用G值和B值都是一样的,没有区别)都改为偶数,如果一个像素点的R值本身是偶数的话,那么不需要改动,如果是奇数的话,那么+1/-1就能完成操作,而刚刚的原理解释中我们提到微小改动值我们眼睛不会发现什么异常。所以这里的改动我们在图片上实际看不出什么区别。

第二步,搞到一张大小一样的空的BMP格式的图片:

整个步骤我们都能用PS搞定。在这张空的图片上我们用颜色为真正的黑色(R:0 G:0 B:0)写下我们要隐写的内容,注意,这一步我们要用的是准确的RGB值,而不是随手在画板工具上随手选一个颜色,因为我们后面是需要精确的对RGB值进行处理的。搞好之后也是要保存为BMP格式哦


接下来我们也同样去读这张图片的数据矩阵,这张图上之后两种颜色,黑色(R:0 G:0 B:0)和白色(R:255 G:255 B:255),所以很好区分,那么这里我们将这个图片中黑色也就是我们文字颜色的像素点对应到在之前的照片的像素点,然后再将这些图片的R通道值改为奇数,这一操作同样是+1/-1就能完成的,所以一样改动不会造成视觉上的差异。

这样我们的隐写过程就结束了。

可能到这里很多同学还不明白,这怎么就结束了?为了让大家更好的去理解这个过程,我们再来对这张图片进行隐写的解密吧。

回忆一下现在这张图的情况,整张图片的所有像素点的R值几乎都为偶数,只有我们第二张图中出现文字的地方的像素点的R值为奇数,那么这里解密的处理操作就是将所有R值为奇数的点的颜色调成一样(黑色),讲所有R值为偶数的点颜色调成一样(白色),那么处理过后我们就能看到这句专属的签名(表白)啦!

祝所有引用次表白方式的程序猿们表白成功!!!

源码:

hide.py:

import cv2import numpyimg = cv2.imread("1.bmp")code = cv2.imread("2.bmp")w,h = img.shape[:2]for i in range(w):    for j in range(h):        if img[i,j,2] %2 != 0:            img[i,j,2] = img[i,j,2]+1 if img[i,j,2] <2 else img[i,j,2]-1for i in range(w):    for j in range(h):        if code[i,j,0] == 0 and code[i,j,1] == 0 and code[i,j,2] == 0:            img[i,j,2] += 1cv2.imwrite("3.bmp",img)
get.py:

import cv2import numpyimg = cv2.imread("3.bmp")out = numpy.zeros(img.shape,np.uint8)w,h = img.shape[:2]for i in range(w):    for j in range(h):        if img[i,j,2] %2 != 0:            out[i,j,0]=255            out[i,j,1]=255            out[i,j,2]=255cv2.imwrite("4.bmp",out)



原创粉丝点击