今天本想研究下图像隐写书的相关算法,结果偶然间发现一个很有意思的现象,如下为jpg格式的原图

我使用Python对其每个像素的三个通道进行遍历,如果色值为偶数,就将其改设为255,如果为奇数则设为零。Python脚本如下:

from PIL import Image
import os
from numpy import *
def jiou(num):
    if (num % 2) == 0:
        return True
    else:
        return False
im = array(Image.open('20170125135222.jpg'))
for i in range(0,683):
    for y in range(0,974):
        for x in range(0,3):
            if(im[y,i,x] == 0):
                im[y,i,x] = im[y,i,x] +255
            elif(im[y,i,x] == 255):
                im[y,i,x] = im[y,i,x] -255
            else:
                if (jiou(im[y,i,x])):
                    im[y,i,x]=255
                else:
                    im[y,i,x]=0
t = Image.fromarray(im)
t.show()

一个很简单的算法,我本以为会得到一张密密麻麻混乱的图像,结果呢?

→_→不还是很混乱吗!

但是仔细观察就会发现一些奇怪的现象

  1. 观察图像全貌,是可以看到主体人物的大致轮廓的,并不想预期的那样一团乱
  2. 放大后发现有许多像素在一起构成了奇怪的纹理
  3. 这些纹理以块状集中出现,而且每块由两种颜色构成
  4. 有某些集中区域只有黑白两种颜色,这些区域在原图中都是近黑色

    我猜想的原因可能是jpg的压缩算法导致的,具体原因没有深究,有哪位大佬知道欢迎留言喵

关于那个隐写术

正如前文,我是在研究隐写术时发现这个现象的。我本想通过下面的方法把信息写到图像里:

先讲要隐藏的信息转为二进制格式,然后遍历已有的图像的像素,如果二进制数字为1,就把像素颜色值就进微调为奇数,反之为偶数,以此达到储存信息的目的。我粗略计算了一下,一张700X900像素的图像大概可以存放120 000个字符,而图像的大小几乎不变!然而。。实际尝试时发现这样处理只能使用bmp格式图像,而一张90kb的图像换成bmp的,大小要增加到1.5mb,显然有点得不偿失了