Python 生成隐藏图像!

例图

图1

图0

mix

原理

图像处理的Alpha通道(png格式的图) - FlyingPanguins - 博客园 (cnblogs.com)
隐藏图原理 - 公式法 - 哔哩哔哩 (bilibili.com)
你这图挺能藏啊?用Python制作隐藏图! - 知乎 (zhihu.com)
Python PIL.Image模块:图片变更尺寸大小(宽x高)_pil image size-CSDN博客
python图像处理库ImageEnhance实现图像的亮度、对比度、色度和锐度四种方式增强_imageenhance.sharpness-CSDN博客
PIL获取图片亮度值的五种方式-CSDN博客

加上透明通道后,由原图像像素与背景像素,可以计算出实际肉眼所见的图像:

q q u a d C o l o r = f r a c A l p h a _ S o u r c e 255 t i m e s C o l o r _ S o u r c e + f r a c 255 − A l p h a _ S o u r c e 255 t i m e s C o l o r _ B a c k g r o u n d q q u a d \\\\\\qquad\\\\ Color=\\frac{Alpha\_{Source}}{255}\\times Color\_{Source}+\\frac{255-Alpha\_{Source}}{255}\\times Color\_{Background} \\\\\\qquad\\\\ qquadColor=fracAlpha_Source255timesColor_Source+frac255Alpha_Source255timesColor_Backgroundqquad

抖音、贴吧等平台,显示图像时优先以纯白色为背景,此时未点开图像,即:

KaTeX parse error: Undefined control sequence: \[ at position 216: …Color\_{White}=\̲[̲R,G,B\]=\[255,2…

点开始,以纯黑色为背景,则:

KaTeX parse error: Undefined control sequence: \[ at position 204: …Color\_{Black}=\̲[̲R,G,B\]=\[0,0,0…

现在,欲将图像1在白色背景下显示,图像2在黑色背景下显示,则二者满足:

q q u a d C o l o r _ 1 = f r a c A l p h a _ m i x 255 t i m e s C o l o r _ m i x + f r a c 255 − A l p h a _ m i x 255 t i m e s C o l o r _ W h i t e q u a d C o l o r _ 2 = f r a c A l p h a _ m i x 255 t i m e s C o l o r _ m i x + f r a c 255 − A l p h a _ m i x 255 t i m e s C o l o r _ B l a c k q q u a d \\\\\\qquad\\\\ Color\_{1}=\\frac{Alpha\_{mix}}{255}\\times Color\_{mix}+\\frac{255-Alpha\_{mix}}{255}\\times Color\_{White} \\\\\\quad\\\\ Color\_{2}=\\frac{Alpha\_{mix}}{255}\\times Color\_{mix}+\\frac{255-Alpha\_{mix}}{255}\\times Color\_{Black} \\\\\\qquad\\\\ qquadColor_1=fracAlpha_mix255timesColor_mix+frac255Alpha_mix255timesColor_WhitequadColor_2=fracAlpha_mix255timesColor_mix+frac255Alpha_mix255timesColor_Blackqquad

其中下标mix表示二者混合生成的图像。

将公式展开为RGB三通道的计算形式:

q q u a d R _ 1 = f r a c A l p h a _ m i x 255 t i m e s R _ m i x + f r a c 255 − A l p h a _ m i x 255 t i m e s R _ W h i t e q u a d G _ 1 = f r a c A l p h a _ m i x 255 t i m e s G _ m i x + f r a c 255 − A l p h a _ m i x 255 t i m e s G _ W h i t e q u a d B _ 1 = f r a c A l p h a _ m i x 255 t i m e s B _ m i x + f r a c 255 − A l p h a _ m i x 255 t i m e s B _ W h i t e q u a d R _ 2 = f r a c A l p h a _ m i x 255 t i m e s R _ m i x + f r a c 255 − A l p h a _ m i x 255 t i m e s R _ B l a c k q u a d G _ 2 = f r a c A l p h a _ m i x 255 t i m e s G _ m i x + f r a c 255 − A l p h a _ m i x 255 t i m e s G _ B l a c k q u a d B _ 2 = f r a c A l p h a _ m i x 255 t i m e s B _ m i x + f r a c 255 − A l p h a _ m i x 255 t i m e s B _ B l a c k q u a d \\\\\\qquad\\\\ R\_1=\\frac{Alpha\_{mix}}{255}\\times R\_{mix}+\\frac{255-Alpha\_{mix}}{255}\\times R\_{White} \\\\\\quad\\\\ G\_1=\\frac{Alpha\_{mix}}{255}\\times G\_{mix}+\\frac{255-Alpha\_{mix}}{255}\\times G\_{White} \\\\\\quad\\\\ B\_1=\\frac{Alpha\_{mix}}{255}\\times B\_{mix}+\\frac{255-Alpha\_{mix}}{255}\\times B\_{White} \\\\\\quad\\\\ R\_{2}=\\frac{Alpha\_{mix}}{255}\\times R\_{mix}+\\frac{255-Alpha\_{mix}}{255}\\times R\_{Black} \\\\\\quad\\\\ G\_{2}=\\frac{Alpha\_{mix}}{255}\\times G\_{mix}+\\frac{255-Alpha\_{mix}}{255}\\times G\_{Black} \\\\\\quad\\\\ B\_{2}=\\frac{Alpha\_{mix}}{255}\\times B\_{mix}+\\frac{255-Alpha\_{mix}}{255}\\times B\_{Black} \\\\\\quad\\\\ qquadR_1=fracAlpha_mix255timesR_mix+frac255Alpha_mix255timesR_WhitequadG_1=fracAlpha_mix255timesG_mix+frac255Alpha_mix255timesG_WhitequadB_1=fracAlpha_mix255timesB_mix+frac255Alpha_mix255timesB_WhitequadR_2=fracAlpha_mix255timesR_mix+frac255Alpha_mix255timesR_BlackquadG_2=fracAlpha_mix255timesG_mix+frac255Alpha_mix255timesG_BlackquadB_2=fracAlpha_mix255timesB_mix+frac255Alpha_mix255timesB_Blackquad

移项为:

q q u a d ( R _ 1 − f r a c 255 − A l p h a _ m i x 255 t i m e s R _ W h i t e ) t i m e s f r a c 255 A l p h a _ m i x = R _ m i x q u a d ( G _ 1 − f r a c 255 − A l p h a _ m i x 255 t i m e s G _ W h i t e ) t i m e s f r a c 255 A l p h a _ m i x = G _ m i x q u a d ( B _ 1 − f r a c 255 − A l p h a _ m i x 255 t i m e s B _ W h i t e ) t i m e s f r a c 255 A l p h a _ m i x = B _ m i x q u a d ( R _ 2 − f r a c 255 − A l p h a _ m i x 255 t i m e s R _ B l a c k ) t i m e s f r a c 255 A l p h a _ m i x = R _ m i x q u a d ( G _ 2 − f r a c 255 − A l p h a _ m i x 255 t i m e s G _ B l a c k ) t i m e s f r a c 255 A l p h a _ m i x = G _ m i x q u a d ( B _ 2 − f r a c 255 − A l p h a _ m i x 255 t i m e s B _ B l a c k ) t i m e s f r a c 255 A l p h a _ m i x = B _ m i x q u a d \\\\\\qquad\\\\ (R\_1-\\frac{255-Alpha\_{mix}}{255}\\times R\_{White}) \\times \\frac{255}{Alpha\_{mix}} = R\_{mix} \\\\\\quad\\\\ (G\_1-\\frac{255-Alpha\_{mix}}{255}\\times G\_{White}) \\times \\frac{255}{Alpha\_{mix}} = G\_{mix} \\\\\\quad\\\\ (B\_1-\\frac{255-Alpha\_{mix}}{255}\\times B\_{White}) \\times \\frac{255}{Alpha\_{mix}} = B\_{mix} \\\\\\quad\\\\ (R\_2-\\frac{255-Alpha\_{mix}}{255}\\times R\_{Black}) \\times \\frac{255}{Alpha\_{mix}} = R\_{mix} \\\\\\quad\\\\ (G\_2-\\frac{255-Alpha\_{mix}}{255}\\times G\_{Black}) \\times \\frac{255}{Alpha\_{mix}} = G\_{mix} \\\\\\quad\\\\ (B\_2-\\frac{255-Alpha\_{mix}}{255}\\times B\_{Black}) \\times \\frac{255}{Alpha\_{mix}} = B\_{mix} \\\\\\quad\\\\ qquad(R_1frac255Alpha_mix255timesR_White)timesfrac255Alpha_mix=R_mixquad(G_1frac255Alpha_mix255timesG_White)timesfrac255Alpha_mix=G_mixquad(B_1frac255Alpha_mix255timesB_White)timesfrac255Alpha_mix=B_mixquad(R_2frac255Alpha_mix255timesR_Black)timesfrac255Alpha_mix=R_mixquad(G_2frac255Alpha_mix255timesG_Black)timesfrac255Alpha_mix=G_mixquad(B_2frac255Alpha_mix255timesB_Black)timesfrac255Alpha_mix=B_mixquad

代入黑、白背景数值为:

q q u a d ( R _ 1 − 255 + A l p h a _ m i x ) t i m e s f r a c 255 A l p h a _ m i x = R _ m i x q u a d ( G _ 1 − 255 + A l p h a _ m i x ) t i m e s f r a c 255 A l p h a _ m i x = G _ m i x q u a d ( B _ 1 − 255 + A l p h a _ m i x ) t i m e s f r a c 255 A l p h a _ m i x = B _ m i x q u a d R _ 2 t i m e s f r a c 255 A l p h a _ m i x = R _ m i x q u a d G _ 2 t i m e s f r a c 255 A l p h a _ m i x = G _ m i x q u a d B _ 2 t i m e s f r a c 255 A l p h a _ m i x = B _ m i x q u a d \\\\\\qquad\\\\ (R\_1-255+Alpha\_{mix}) \\times \\frac{255}{Alpha\_{mix}} = R\_{mix} \\\\\\quad\\\\ (G\_1-255+Alpha\_{mix}) \\times \\frac{255}{Alpha\_{mix}} = G\_{mix} \\\\\\quad\\\\ (B\_1-255+Alpha\_{mix}) \\times \\frac{255}{Alpha\_{mix}} = B\_{mix} \\\\\\quad\\\\ R\_2 \\times \\frac{255}{Alpha\_{mix}} = R\_{mix} \\\\\\quad\\\\ G\_2 \\times \\frac{255}{Alpha\_{mix}} = G\_{mix} \\\\\\quad\\\\ B\_2 \\times \\frac{255}{Alpha\_{mix}} = B\_{mix} \\\\\\quad\\\\ qquad(R_1255+Alpha_mix)timesfrac255Alpha_mix=R_mixquad(G_1255+Alpha_mix)timesfrac255Alpha_mix=G_mixquad(B_1255+Alpha_mix)timesfrac255Alpha_mix=B_mixquadR_2timesfrac255Alpha_mix=R_mixquadG_2timesfrac255Alpha_mix=G_mixquadB_2timesfrac255Alpha_mix=B_mixquad

则有:

q u a d A l p h a _ m i x = 255 − R _ 1 + R _ 2 q u a d A l p h a _ m i x = 255 − G _ 1 + G _ 2 q u a d A l p h a _ m i x = 255 − B _ 1 + B _ 2 q u a d \\\\\\quad\\\\ Alpha\_{mix}=255-R\_1+R\_2 \\\\\\quad\\\\ Alpha\_{mix}=255-G\_1+G\_2 \\\\\\quad\\\\ Alpha\_{mix}=255-B\_1+B\_2 \\\\\\quad\\\\ quadAlpha_mix=255R_1+R_2quadAlpha_mix=255G_1+G_2quadAlpha_mix=255B_1+B_2quad

即欲使方程成立,可以有以下两种情况成立,

其一,两图像三通道对应的差值相等:

\\\quad\\ R_2-R_1=G_2-G_1 \\\quad\\ G_2-G_1=B_2-B_1 \\\quad\\

其二,两图像均为灰度图像:

\\\quad\\ R_1=G_1=B_1 \\\quad\\ R_2=G_2=B_2 \\\quad\\

且:

\\\quad\\ 0\leq 255-R_1+R_2 \leq 255 \\\quad\\ 0\leq 255-G_1+G_2 \leq 255 \\\quad\\ 0\leq 255-B_1+B_2 \leq 255 \\\quad\\

则有:

\\\quad\\ R_{mix}=R_2 \times \frac{255}{255-R_1+R_2} \\\quad\\ G_{mix}=G_2 \times \frac{255}{255-G_1+G_2} \\\quad\\ B_{mix}=B_2 \times \frac{255}{255-B_1+B_2} \\\quad\\ R_2 \leq R_1 \\\quad\\ G_2 \leq G_1 \\\quad\\ B_2 \leq B_1 \\\quad\\

经过上面推导,我们知道,欲得到隐藏图像的混合图,需要:

  • 不严谨地讲,图象2的亮度要小于图1(经验证,通过算法使得图像2每个像素小于图像1,会导致图像混合,只能分别整体调整亮度)
  • 图1和图2都需要先转换为灰度图像(经过验证,如果通过算法使得图1、图2各通道差值相同,则会导致图像混合)
  • 图像1和图像2的均为完全不透明图像

代码

 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # @Time : 2024/2/20 21:26
 # @Author : SONG-LE
 # @vx : yukinoyuki-_-
 # @知乎 : https://www.zhihu.com/people/xiao-xue-sheng-ye-xiang-xie-shu
 ​
 from PIL import Image
 from PIL import ImageEnhance
 import numpy as np
 ​
 # 文件名
 img1_path = '1.png'
 img0_path = '0.png'
 ​
 # 读取图像:转为灰度图;调整尺寸大小
 img1 = Image.open(img1_path).convert('L').resize((800, 600))
 img0 = Image.open(img0_path).convert('L').resize((800, 600))
 ​
 # 增强图像1亮度,减小图像0亮度
 img1 = ImageEnhance.Brightness(img1).enhance(1.1)
 img0 = ImageEnhance.Brightness(img0).enhance(0.8)
 ​
 # 获取图像矩阵,转换为浮点数矩阵,方便计算
 mt1=np.array(img1).astype(np.float32)
 mt0=np.array(img0).astype(np.float32)
 ​
 # 亮度平均比
 print(np.mean(mt1),np.mean(mt0),np.mean(mt1)/np.mean(mt0))
 ​
 # 公式计算过程
 alpha=255+mt0-mt1
 alpha[alpha==0]=1 # 防止除以零
 alpha[alpha>255]=255 # 将溢出的数值设置为255
 mt=mt0*255/alpha
 ​
 # 导出图像
 # img=np.zeros((600, 800,4), dtype=np.uint8)
 # img[:,:,0]=mt
 # img[:,:,1]=mt
 # img[:,:,2]=mt
 # img[:,:,3]=alpha
 img=np.zeros((600, 800,2), dtype=np.uint8) # uint8为图像矩阵格式,整数数值在:0~255
 img[:,:,0]=mt
 img[:,:,1]=alpha
 img=Image.fromarray(np.array(img,dtype=np.uint8))
 img.save('result.png',format='png')

以上就是“Python 生成隐藏图像!”的全部内容,希望对你有所帮助。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值