python opencv制作隐藏图片

前言

隐藏图片就是在白色背景和黑色背景显示出不同的图片,之前qq可以显示,现在好像也不行了,原因就是原来的qq,在发出来默认是白色背景,而点开后是黑色背景。但是这个原理还是挺有意思的,所以简单的研究了一下

隐藏图原理

参考文章
原理参考文章里面说的很详细了,这里不多赘述。
一个要注意的一点是,在黑色背景显示的图片需要进行一下处理,否者效果及其不好,就是降低对比度,并提高亮度(为了在白色背景下隐藏的更好),这一点也是文章没有提到的。

代码实现

import time
import cv2
import numpy as np
import sys

Wimg = cv2.imread('1.jpg') #白色背景显示的图片 Wimg为white-img缩写
Wimg = cv2.cvtColor(Wimg,cv2.COLOR_BGR2GRAY)
Wimg = cv2.cvtColor(Wimg,cv2.COLOR_GRAY2BGRA)

Bimg = cv2.imread('2.jpg') #黑色背景显示的图片 Bimg为black-img缩写
Bimg = cv2.cvtColor(Bimg,cv2.COLOR_BGR2GRAY)
Bimg = cv2.cvtColor(Bimg,cv2.COLOR_GRAY2BGRA)

h1,w1 = Wimg.shape[:2]
h2,w2 = Bimg.shape[:2]
h = min([h1,h2])
w = min([w1,w2])
# 奇数列行,为了交错排列两张图片
if h % 2 == 0:
    h -= 1
if w % 2 == 0:
    w -= 1

# 降低对比度,并提高亮度
Bimg = cv2.addWeighted(Bimg,0.3,0,0,100)

Wimg = cv2.resize(Wimg,(w,h))
Bimg = cv2.resize(Bimg,(w,h))
Rimg = np.zeros([h,w,4],dtype=np.uint8)
flag = True
print(h,w)
for y in range(h):
    for x in range(w):
        if flag:
            # 显示白色图片
            Rimg[y,x] = Wimg[y,x]*0.3
            Rimg[y,x,3] = 255-Wimg[y,x,0]
            flag = False
        else:
            # 显示黑色图片
            Rimg[y,x] = Bimg[y,x]
            Rimg[y,x,3] = Bimg[y,x,0]
            flag = True

cv2.imwrite('result.png',Rimg, [cv2.IMWRITE_PNG_COMPRESSION, 0])

效果查看

我这里直接用 gimp 新建图层来看效果,这样效果也会更加明显。
白色背景显示的图片:在这里插入图片描述

黑色背景显示的图片:
在这里插入图片描述

posted @ 2021-01-10 15:52  Hello_wshuo  阅读(98)  评论(0编辑  收藏  举报