恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

光学衍射神经网络实现多图像加密与隐藏的MATLAB方案解析

  • 首页
  • 资讯中心
  • /
  • 光学衍射神经网络实现多图像加密与隐藏的MATLAB方案解析

相关资讯

用VB控制安捷伦波形发生器:VISA编程实战指南 2026/10/19 10:08:50
跨平台系统还原保护:Windows/Linux/Android统一策略 2026/10/19 10:08:50
xc7a100tfgg484 FPGA板卡参考设计:从电源树到GTP高速链路 2026/10/19 10:08:50

最新资讯

CNN并行计算全解析:数据并行、模型并行与张量并行的实战策略
AI数字员工实战:用Moltbot搭建自动化工作流的完整指南
RNN、LSTM、BiLSTM三部曲:从原理到实战的序列建模指南
GitHub周榜风向:AI代码审查、向量检索与本地优先工具解析
深度学习中的CNN并行计算:四大并行策略、工程实现与避坑指南
软件I2C模拟16位寄存器地址的读写实现与调试指南

今日推荐

OpenCowork 实测:支持本地文件、飞书机器人的 Windows AI 助手(只需配置 Token)
GPT-6 Sol 与 Luna 怎么选?Chat、Work、Codex 版本差异与 TaoToken 接入实测
openclaw.net 集成 ElBruno.MempalaceNet 记忆系统:把 MCP 配置改到 TaoToken 的完整实践

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

光学衍射神经网络实现多图像加密与隐藏的MATLAB方案解析

发布时间:2026/10/19 10:08:50
光学衍射神经网络实现多图像加密与隐藏的MATLAB方案解析 光学衍射神经网络Optical Diffraction Neural Network简称ODNN这几年在光学计算领域被反复提及但我发现真正能落地到“图像加密”这种应用场景的代码案例其实不多。当你手头有一份“基于光学衍射神经网络进行多图像加密和隐藏”的MATLAB代码时第一反应可能是这东西怎么跑起来跑起来之后又该怎么看效果我这篇就结合我对这类方案的复现经验和理解把这个项目的设计思路、核心原理、关键代码逻辑以及实操中容易踩的坑一次性讲清楚。适合正在做光学加密方向、对光学计算感兴趣、或者手里拿到了代码但不知道从哪儿入手的读者。1. 先搞清楚这个项目到底在解决什么问题1.1 光学加密的底子是光场处理传统的光学加密方案绕不开“双随机相位编码”这个老前辈。它的基本逻辑很简单输入平面放一块随机相位板频谱面再放一块随机相位板明文经过两次随机相位调制后在输出端形成一幅不可辨识的类噪声分布也就是密文。解密时用密钥两块相位板的共轭做逆变换就能恢复明文。这套方案理论很漂亮但实操起来有几个绕不开的痛点。第一它天然是一对一的一张明文加密成一张密文想同时处理多张图就得靠复用技巧比如波长复用、角度复用、轨道角动量复用这会让光学系统变得极其复杂。第二系统结构是固定的改一次密钥几乎等于重搭一次光路。第三双随机相位编码本质上是线性变换安全性更多依赖密钥的随机性而不是系统本身的复杂性。所以当“光学衍射神经网络”这个概念出现之后大家发现这个东西天生适合干加密——因为它本身就是由多个相位调制层和层间衍射传播构成的光学计算系统通过训练可以让网络自动学会“输入明文到输出密文”的复杂非线性映射。1.2 光学衍射神经网络是怎么参与加密的ODNN的核心结构不复杂一束光经过输入平面进入网络依次穿过若干个相位调制层每一层改变光场的相位光在层与层之间的自由空间传播过程中发生衍射最后在输出平面形成光强分布。关键在于这些相位层的相位分布不是手工设计的而是通过训练学出来的。你可以把它理解成一个物理形态的全连接神经网络——每一层相位调制相当于给输入光场做了一次加权运算层间的衍射传播就相当于一种天然的非线性信息混合过程。用这个网络做图像加密思路就变得非常直观了我不需要像传统方案那样去设计具体的加密算法只需要把“多张明文图像”作为输入“对应的密文图像”作为输出端到端训练这个光学网络让它自己学会把多张图的信息隐藏进一个不可辨识的光场分布中。1.3 “多图像加密和隐藏”到底什么意思我最初看到这个标题也有一点疑惑“加密”和“隐藏”是不是两件事实际做下来发现在这个项目里它们确实是一件事的两个层面。加密层面多张明文图像经过ODNN之后在输出平面形成的光强分布不再是任何一张明文的样子而是像散斑噪声一样的东西不知道密钥的人拿到这个分布完全无法还原原始图像。隐藏层面ODNN的输出通常是一幅二维光强图但你可以在同一幅输出图里同时承载多张明文的信息通过空间划分或者密钥分离把不同图像“藏”在不同的区域或通道里。授权用户拿到正确的密钥之后才能从这团噪声中解出对应位置的图像。所以多图像加密、多图像隐藏本质上是同一个系统要同时实现的两个能力多路并行加密以及不可感知的密钥分离恢复。2. 多图像加密的整体设计方案2.1 设计目标与硬性约束在动手写代码之前必须先把设计目标列清楚否则训练出来的网络很容易“看起来收敛了但实际用不了”。核心目标有三个。第一个是多图并行N张图像能同时加密、同时解密而不是一张一张来。第二个是隐藏性输出平面的密文分布不能有人眼可辨识的原始图像信息残留。第三个是鲁棒性解密得到的图像与原始图像之间误差足够小人眼视觉上能接受。除了这三个目标还有一个光学系统本身带来的硬约束目前的探测器只能记录光强也就是振幅的平方相位信息在输出端会丢掉。这意味着ODNN的输出标签必须是强度分布而不是复振幅。很多初学者第一次训练时总是拿“复振幅”做目标结果输出平面怎么看都不对根源就在这里。2.2 空间复用与区域映射的思路多图像加密最常用的实现方案是空间复用加区域映射。具体做法如下。假设有4张明文图像先把每张图缩放到64×64像素。然后构造一个128×128的输入光场把这4张图分别放在输入平面的左上、右上、左下、右下四个64×64区域形成一个“四合一”的输入图案。ODNN的输出平面同样划分成四个64×64区域。训练时给网络设定的目标是输入平面左上区域的图像信息经过整个衍射网络之后主要能量落在输出平面的左上区域右上输入落在右上输出依此类推。这样训练完之后加密阶段就是把这四张图按同样的位置摆放然后输入网络得到的整幅输出强度图就是密文。解密阶段更简单——从输出平面把对应位置的64×64区域截取出来再做一次归一化处理就是明文图像。这个方案的巧妙之处在于输出平面的四个区域在空间上是分开的但网络在训练过程中会强制让四个区域的信息在中间层产生混合所以最终整幅输出图是一张整体不可解的密文而不是四张明文图的简单堆放。换句话说表面上分区域实质上是全局隐藏。2.3 密钥怎么设计才靠谱很多人以为训练完网络就完事了其实密钥设计才是这个项目能不能真正用于加密的关键。在这个方案里密钥可以由几个不同层级的东西构成。第一层是随机相位模板在输入图像上叠加一个随机相位板相当于把明文信息在输入光场里先打散一次没有这个相位板的人即使拿到输出分布和网络参数也无法恢复原始图像。第二层是区域映射规则四张图的摆放顺序和输出区域的对应关系本身就可以作为密钥不告诉别人第几张图对应哪个区域对方即使解出四块噪声也无法对应到正确的明文。第三层是网络参数本身ODNN那些训练好的相位层分布相当于一个天然的物理密钥放大器不同的人即使拿到了数字域的输出数据也没法在物理上复现解密过程。我在实际复现时一般是三层同时使用。输入相位模板负责打散明文相关性区域映射负责多图分离网络参数负责光学解码的唯一性。三层组合起来整个系统的安全性比我最初预想的高很多。3. 光学衍射神经网络的核心原理3.1 光场表示与相位层的数学模型在MATLAB里模拟光学衍射神经网络第一步是要搞懂光场是拿什么数据结构表示的。一束相干光在某个平面上的分布可以表示成复振幅U(x, y)这个复振幅包含两部分振幅A(x, y)和相位φ(x, y)。写成数学形式就是U A · exp(j·φ)。在代码里这就是一个二维复数矩阵。输入平面的光场由两部分构成一部分是明文图像的振幅信息另一部分是可以选择的初始相位。如果想让系统对振幅图像直接加密可以让输入光场的振幅等于明文图像的灰度值归一化结果相位可以是随机相位模板也可以设成零相位板。实际项目中为了增强安全性几乎都会加随机相位模板。ODNN里的相位层是最核心的可学习参数。每一层本质上就是一个二维相位分布θ(x, y)当光场经过这一层时透过率函数写为t exp(j·θ)。也就是说光场的振幅不改变只改变相位。这样做的原因很简单——纯相位调制在物理实验中实现最容易用空间光调制器就能直接加载。3.2 衍射传播的数值模拟光在两层相位板之间的自由空间传播是这个网络里最微妙的部分。物理上可以精确描述数字模拟时通常用角谱法。角谱法的核心公式很容易理解。先对输入光场做二维傅里叶变换得到它的角谱也就是空间频率域的表示然后在频域里乘一个传播传递函数H这个H描述了不同空间频率分量在传播距离z之后的相位演化最后再做逆傅里叶变换就得到了传播之后的光场。对应的MATLAB代码非常简单function U_out angular_spectrum_prop(U_in, lambda, dx, z) % 角谱法模拟光场自由传播 % U_in - 输入复振幅二维复数矩阵 % lambda - 光波长单位米 % dx - 像素物理尺寸单位米 % z - 传播距离单位米 [M, N] size(U_in); % 空间频率坐标 fx (-N/2 : N/2-1) / (N * dx); fy (-M/2 : M/2-1) / (M * dx); [FX, FY] meshgrid(fx, fy); % 传播传递函数 k 2 * pi / lambda; H exp(1j * k * z .* sqrt(1 - (lambda * FX).^2 - (lambda * FY).^2)); % 频域滤波再还原 U_out ifft2(fft2(U_in) .* H); end这段代码是整个网络的“地基”。我建议你拿到任何ODNN相关代码时先把这个函数单独拿出来做一次验证输入一个已知的光场比如一个圆形孔径看传播不同距离后的光强分布是否正确。如果这一步就不对后面整个网络训练都是白费。3.3 前向传播的整体流程一个典型的三层ODNN前向传播可以写成下面这个序列。输入光场U0先经过第一层相位调制变成U0·exp(j·θ1)然后通过角谱法传播一段距离d1到达第二层相位板。再经过第二层相位调制、传播、第三层相位调制、传播最后到达输出平面。输出平面的探测器记录的是光强所以最终结果是I_out |U_final|^2。这个前向传播过程在深度学习的语境里就是一个多层的计算图每一层相位板的参数θ就是待训练的网络权重。你可以在MATLAB里用dlarray和自定义训练循环实现也可以用Deep Learning Toolbox里的自定义层。这里有一个非常关键的细节输出端是强度。因为平方操作会让梯度计算变复杂很多人在实现反向传播时容易出错。如果对自动微分不熟建议直接用dlarray配合深度学习工具箱的反向传播让MATLAB替你算梯度。3.4 损失函数与训练策略损失函数的选择直接决定加密效果好不好。我试过的方案里效果比较稳定的是“输出强度归一化MSE”。做法是在网络输出端得到I_out之后先把整幅输出强度图除以它的最大值把强度归一化到0~1范围然后与同样归一化的目标强度图计算均方误差。为什么要归一化再去算损失因为光学传播过程中能量本来就有缩放如果直接用原始强度去算MSE网络会把大量精力花在学习“把亮度调到一致”上而忽略了图像结构本身的重建最后训练曲线看着下降了恢复效果却很差。训练策略上优化器推荐用Adam学习率初始设置在0.001到0.005之间。相位层初始化可以设成全零或者小幅度随机。我实际测试下来全零初始化在简单任务上收敛更快但在多图像任务上建议用随机初始化否则对称性问题容易导致多路映射分不开。4. MATLAB代码实现与关键参数4.1 代码整体框架我复现过好几套ODNN的MATLAB实现代码风格虽然有差异但整体骨架大体一致。拿到一份这样的代码你最先要找的是以下五个部分。第一段是参数初始化脚本通常放在主文件开头。包含图像尺寸、像素物理尺寸、波长、层间距离、相位层层数、训练轮数、学习率等。第二段是角谱法传播函数处理光场在层间的传播通常是一个独立的.m文件。第三段是网络前向传播函数输入是光场和当前相位层参数输出是输出平面的强度分布。第四段是训练循环负责计算损失、反向传播、更新参数。第五段是测试可视化把训练好的模型用于新的图像展示加密和解密效果。如果你的代码是用类或函数句柄组织的也万变不离其宗。先把上面五块在代码里定位出来通读一遍就能知道这份代码大概能干什么哪些参数可以改。4.2 网络前向传播怎么写我用一个简化版的前向传播函数来说明假设网络有3层相位层层间距相同。function I_out odnn_forward(U_in, phase_layers, lambda, dx, z) % 三层相位衍射网络前向传播 % phase_layers - 1x3 cell 数组每个cell是相位分布矩阵 U U_in; for ll 1:length(phase_layers) % 相位调制 U U .* exp(1j * phase_layers{ll}); % 自由空间衍射传播到下一层 U angular_spectrum_prop(U, lambda, dx, z); end % 输出平面探测强度 I_out abs(U).^2; end注意这个函数里最后有一次传播是到达输出平面的。如果层间距离和输出距离不一样你需要额外传入一个输出距离参数。有些实现会把最后一段距离单独设为output_prop_distance这样可以多一个额外自由度训练效果通常会好一点点。4.3 训练循环与梯度更新如果你用的是MATLAB Deep Learning Toolbox可以把相位层参数定义为dlarray然后用dlgradient自动求梯度。关键流程如下。for epoch 1:max_epochs for batch 1:num_batches [loss, grads] dlfeval(modelLoss, phase1, phase2, phase3, ... input_batch, target_batch, lambda, dx, z); [phase1, avg1] adamupdate(phase1, grads{1}, avg1, iter, lr); [phase2, avg2] adamupdate(phase2, grads{2}, avg2, iter, lr); [phase3, avg3] adamupdate(phase3, grads{3}, avg3, iter, lr); end end其中modelLoss函数内部就是前向传播加损失计算。我强烈建议把输入的明文图像、随机相位模板、输出目标图都做成一个结构体统一管理否则训练数据一多索引特别容易错。如果你手里的代码不用深度学习工具箱而是手写反向传播那你需要自己推导相位层的梯度。具体来说损失对输出强度的梯度分别是强度平方的导数乘误差而在反向传播到复振幅时要处理复数的共轭梯度。强烈不推荐新手手写直接用工具箱更省事而且不容易出错。4.4 核心参数参考表我把自己复现不同任务时比较稳的参数组合整理成了表格供参考。参数名称典型数值备注说明图像尺寸64×64像素起步建议用64跑通后再放大输入平面尺寸128×128像素4图并行时正好各占一个象限像素物理尺寸dx10~20微米对应实际空间光调制器的像素大小光波长λ532nm或633nm常见可见光激光波长层间距离z0.1~0.2米距离越大衍射越明显但高频细节丢失越多相位层层数3~5层3层起步串扰严重再增加优化器Adam比SGD稳太多学习率0.001~0.005太高发散太低收敛太慢训练轮数150~20064×64图像在这个范围内基本收敛随机相位强度0~1均匀分布作为密钥叠加到输入图像上这里我要提醒一下图像尺寸和像素物理尺寸之间有很强的耦合关系。在角谱法里空间频率分辨率和实际尺寸有关如果你在MATLAB里把64×64的图像缩放成128×128但没有同步更新像素尺寸dx那么物理上的衍射效应会完全不一样。这也是加密解密效果复现不出来的常见原因。5. 实操中的坑与排查心得5.1 输出全是亮度均匀的大光斑这是最常见的失败模式训练结束后网络对任何输入都输出一个模糊的大光斑完全没有图像结构。我遇到过这个问题的原因有两种。第一是传播距离太大高频信息在衍射过程中丢失得太厉害网络再怎么训练也没法恢复细节。这时候把层间距从0.2米降到0.1米或者缩小像素尺寸情况会立刻改善。第二是损失函数里没有对输出强度做归一化网络只需要把能量摊平就能最小化MSE根本没有动力去学图像结构。改成归一化MSE之后现象基本会消失。5.2 多图串扰明显训练时四张图都能恢复但测试时换成新的四张图输出区域的图像互相混叠出现“叠影”。几乎每个做多图加密的人都会碰到这个阶段。串扰的本质是网络没有学到足够强的空间选择性。解决办法有三个按优先级排序。第一个办法是增加输入平面上不同图像的间隔让各图像在进入网络前在空间上离得更远这样早期衍射的混叠效应会减弱。第二个办法是增加相位层层数从3层加到4层或5层让网络有更多自由度去解耦不同区域。第三个办法是调整训练数据的随机顺序不要固定地按同样顺序喂给网络否则网络会过拟合到特定的组合方式。5.3 解密图对比度低像蒙了一层雾解密出来的图像结构是对的但整体灰蒙蒙的对比度明显不如原始图。这个问题的根源通常是输出强度包含了较强的零频背景。光学网络里零频分量对应光场的直流能量在衍射传播后很容易形成均匀基底。解决方法是在损失函数里加入一个惩罚项对输出强度的均值做惩罚迫使网络压低直流分量。最简单的实现方式是在计算MSE之前把输出强度减去其空间平均值再加回来。这样网络会学到“去除背景”的解密方式恢复的图像对比度会好很多。我在测试时加了这个操作后峰值信噪比通常能提升2~3dB。5.4 训练太慢、内存爆炸64×64的图像起步三层网络在CPU上训练150轮大约需要一到两小时。如果直接上128×128或者更大尺寸训练时间和内存消耗会成倍增加。这里有一个实用技巧先在小尺寸上做网络结构验证。用32×32甚至16×16的图像把整个训练流程跑通确认损失能降下去、解密效果符合预期再逐渐增大图像尺寸。另外在训练循环里如果不需要保存中间层的完整光场尽量及时清空不需要的中间变量否则MATLAB的多次迭代会产生大量临时对象内存很快就满了。还有一个细节角谱法里FFT的计算时间是图像尺寸的平方级增长64×64只需要几毫秒一次128×128就是接近几十毫秒256×256就直接到几百毫秒了。所以如果训练数据量大优先用GPU加速让MATLAB的fft2自动运行在GPU上速度提升非常可观。5.5 代码注释不足时的阅读顺序建议你手里的代码如果注释很少我的建议是先找到训练循环然后在训练循环被调用的函数里逐个往上找。先从modelLoss函数看输入输出是什么搞清楚它调用了哪些子函数再一项项去对照网络前向传播和损失计算。通常情况下最难读懂的部分是损失函数因为里面往往混合了归一化、区域划分、掩膜加权好几个操作。把这部分拆出来单独运行几次把中间变量分别打印出来看一眼就什么都清楚了。我个人在实际操作中的体会是光学衍射神经网络做多图像加密最大的价值不是“加密算法”本身而是把加密问题转换成了一个可以端到端训练的光学系统设计问题。你不再需要手工设计加密变换只需要定义输入输出映射和损失函数网络自己会找出最优的光学参数分布。如果你手头的代码能跑通我建议你在现有基础上尝试一个自己的小扩展比如把明文图像换成真实灰度照片或者把输出区域改成非对称划分看看网络的适应能力到底有多强。这个方向的可玩性很高值得多花一点时间折腾。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号