例图
图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+frac255−Alpha_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+frac255−Alpha_mix255timesColor_WhitequadColor_2=fracAlpha_mix255timesColor_mix+frac255−Alpha_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+frac255−Alpha_mix255timesR_WhitequadG_1=fracAlpha_mix255timesG_mix+frac255−Alpha_mix255timesG_WhitequadB_1=fracAlpha_mix255timesB_mix+frac255−Alpha_mix255timesB_WhitequadR_2=fracAlpha_mix255timesR_mix+frac255−Alpha_mix255timesR_BlackquadG_2=fracAlpha_mix255timesG_mix+frac255−Alpha_mix255timesG_BlackquadB_2=fracAlpha_mix255timesB_mix+frac255−Alpha_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_1−frac255−Alpha_mix255timesR_White)timesfrac255Alpha_mix=R_mixquad(G_1−frac255−Alpha_mix255timesG_White)timesfrac255Alpha_mix=G_mixquad(B_1−frac255−Alpha_mix255timesB_White)timesfrac255Alpha_mix=B_mixquad(R_2−frac255−Alpha_mix255timesR_Black)timesfrac255Alpha_mix=R_mixquad(G_2−frac255−Alpha_mix255timesG_Black)timesfrac255Alpha_mix=G_mixquad(B_2−frac255−Alpha_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_1−255+Alpha_mix)timesfrac255Alpha_mix=R_mixquad(G_1−255+Alpha_mix)timesfrac255Alpha_mix=G_mixquad(B_1−255+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=255−R_1+R_2quadAlpha_mix=255−G_1+G_2quadAlpha_mix=255−B_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必备开发工具
三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、Python练习题
检查学习结果。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
最后祝大家天天进步!!
上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。