作为一个所谓的学习图像处理、计算机视觉方向的IT人士,这竟然是我的第一个和图像稍稍有点关系的文章。真的是辜负了老师的栽培,师兄的指导,同学的督促。我有罪呀!!!
首先请大家看两张图片,一定要擦亮眼睛呦呦呦--->
我想即使擦亮了您那钛合金闪闪发亮的大眼睛,也不会发现这两张图片之间的差异。可能只会觉得,呦呦呦,这个男的太帅啦!(不接受反驳,有能耐你来打我呀,哈哈,你来打我我就跑!!!撒丫子就跑!!)。其实我是将一段文字信息隐藏在了第二张图片中,到底是隐藏了什么,下面会提到。
整个程序用到了python和opencv,通过四个主要的函数实现加密功能。四个函数的作用如下:
(1)对待加密文字进行编码处理,将处理结果保存到input.txt文件中
(2)将文字处理后的编码隐藏到图片中
(3)从图片中获得加密信息,并将文字编码保存到output.txt文件中
(4)处理output.txt文件中的编码信息,获得隐藏在图片中的文字信息。
其中(1)和(2)属于加密过程,(3)和(4)属于解密过程。
整个工程目录结构如图所示:
在两个python脚本文件中,我编写了五个函数,调用这些函数就可以实现图片加密功能。两个txt文件保存的分别是待加密的文字编码数据和已经解密出的文字编码数据。两份文件中的内容是一样的,但一个是输入,另一个是输出。两张图片分别是原始图片和加密后的图片,就是我上面放的两张图片。
至于为什么要写两个python脚本,事情是这样的。我需要将汉字转化为二进制编码进行保存,但是该转化函数只能在python3下实现。我要用opencv对图片进行加密,但是我配置的opencv只能在python2下使用,所以我将处理汉字编码的函数和图像处理的函数写在了两个不同的脚本中,分别使用Python2和python3运行。
首先科普一下,为什么加了内容的图片用肉眼看不出来?因为图片是由一个个像素组成的,每一个像素包含三个值,分别是RGB值,而RGB的取值范围是0-255。我只是在这些值上做加一或者减一的操作,对于色域的影响特别小,所以根本就看不出来。
在python中,每一个汉字都对应一个数字,比如“仁”字,对应的十进制数字是20161,而20161对应的二进制是“100111011000001”。这是一个15位的二进制数字,但有些文字的二进制码是16位,为了能保证每个汉字都被编码并隐藏到像素中,我就用18位二进制数来保存所有的待加密文字。一个像素可以存储三个二进制位,那么六个像素就能存储一个汉字。一个分辨率为1024X768的图片大概能隐藏130560个文字(1024/6*768)。
那么如何将汉字对应的二进制数隐藏到图像的像素值中呢?是这样的,如图所示,我首先打印出六个原始像素值,使用这六个像素就可以隐藏一个汉字。
先将原始的像素值进行处理,令所有值为奇数的像素值变成偶数,而原来就是偶数的像素值则不变,处理后的像素值如图所示:
现在就可以将我准备隐藏的文字“仁”所对应的二进制值100111011000001隐藏到图像中,将每一位二进制值加到处理后的像素值上。加密后,这六个像素值为:
经过上述的操作,就实现了隐藏汉字的功能。偶数取0,奇数取1,则上面的像素值可以提取出000100111011000001这个二进制数。再利用函数,就可以将这个二进制转化成十进制数20161,再利用函数就可以将其转化为汉字“仁”。
下面我将程序以图片形式贴出来:
处理文字的程序:
对,我图片中的加密信息就是“这个人是智障,大家不要理他!”哈哈哈
处理图像的程序:
实现这个功能的程序已经放到了我的GitHub上。程序的链接地址是 https://github.com/t20134297/HiddenContent2Image
领取专属 10元无门槛券
私享最新 技术干货