✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab完整代码及仿真定制内容点击👇
🔥 内容介绍
数字水印技术作为一种重要的信息安全技术,能够将版权信息、认证信息等嵌入到数字媒体中,在版权保护、内容认证等方面发挥重要作用。图像隐写技术是数字水印技术的重要分支,其目标是在不明显改变图像内容的前提下,将水印信息嵌入到图像中,并能在需要时提取水印信息。本文将介绍基于离散余弦变换 (DCT) 的图像隐写技术,并详细阐述水印嵌入和提取的具体步骤。
1. 概述
近年来,随着互联网技术的飞速发展,数字媒体的传播和应用越来越广泛。然而,数字媒体的易复制性也带来了版权保护等问题。数字水印技术作为一种重要的信息安全技术,能够将版权信息、认证信息等嵌入到数字媒体中,在版权保护、内容认证等方面发挥重要作用。
图像隐写技术是数字水印技术的重要分支,其目标是在不明显改变图像内容的前提下,将水印信息嵌入到图像中,并能在需要时提取水印信息。隐写技术需要满足以下几个方面的要求:
-
不可感知性: 嵌入水印后,图像内容不能发生明显变化,人眼无法察觉水印的存在。
-
鲁棒性: 嵌入的水印信息应该能够抵抗各种攻击,例如压缩、噪声、滤波等。
-
容量: 嵌入的水印信息应该能够承载足够的信息量,例如版权信息、认证信息等。
-
安全性: 水印信息应该能够被安全地嵌入和提取,防止未授权的访问和修改。
2. 基于 DCT 的图像隐写技术
离散余弦变换 (DCT) 是一种常用的图像压缩技术,它可以将图像信息分解成不同频率成分的系数。DCT 具有能量集中、去相关性等特点,使其成为图像隐写技术的理想选择。
基于 DCT 的图像隐写技术的基本原理是:将水印信息嵌入到 DCT 系数中。由于 DCT 系数的能量集中在低频区域,因此将水印信息嵌入到低频系数中可以更好地保持图像的不可感知性。同时,由于 DCT 系数具有去相关性,因此将水印信息分散嵌入到多个 DCT 系数中可以提高水印的鲁棒性。
3. 水印嵌入
水印嵌入的具体步骤如下:
-
将原始图像进行 DCT 变换,得到 DCT 系数矩阵。
-
选择合适的 DCT 系数作为嵌入位置,例如低频系数。
-
将水印信息转换为二进制序列。
-
将二进制序列嵌入到选择的 DCT 系数中,例如通过修改 DCT 系数的值。
-
对嵌入水印后的 DCT 系数进行反 DCT 变换,得到嵌入水印后的图像。
4. 水印提取
水印提取的具体步骤如下:
-
对嵌入水印后的图像进行 DCT 变换,得到 DCT 系数矩阵。
-
从 DCT 系数矩阵中提取嵌入水印信息的位置。
-
从 DCT 系数中提取嵌入的水印信息,例如通过比较 DCT 系数的值与原始 DCT 系数的值。
-
将提取的水印信息转换为二进制序列。
-
对二进制序列进行解码,得到最终的水印信息。
5. 实验结果
为了验证基于 DCT 的图像隐写技术的有效性,可以进行实验测试。实验结果表明,该技术可以有效地将水印信息嵌入到图像中,并且能够抵抗各种攻击。例如,在 JPEG 压缩、高斯噪声和中值滤波等攻击下,该技术仍然能够提取出完整的水印信息。
6. 结论
基于 DCT 的图像隐写技术是一种有效的信息安全技术,能够在不明显改变图像内容的前提下,将水印信息嵌入到图像中,并能在需要时提取水印信息。该技术具有不可感知性、鲁棒性、容量和安全性等优点,在版权保护、内容认证等方面具有广泛的应用前景。
📣 部分代码
function [refGrid,idealGrid] = hReferenceGrid(carrier,bwpCfg,configArray,nSlots,phyChannelType)
%hReferenceGrid Create a DM-RS based reference grid for a given number
% of slots. It also returns a grid of known data IQs.
% [REFGRID,IDEALGRID] = hReferenceGrid(CARRIER,BWPCFG,CONFIGARRAY,...
% NSLOTS,PHYCHANNELTYPE)
% creates a DM-RS based reference grid and known data based grid for a
% given number of slots and physical channel type.
% REFGRID contains the DM-RS symbols specified in CONFIGARRAY and
% is of dimensions K-by-N-by-L, where K is number of subcarriers of
% size carrier.NSizeGrid*12, N is the number of symbols spanning
% nSlots and L is the number of layers.
% IDEALGRID contains known data IQ symbols specified in CONFIGARRAY
% and is of dimensions K-by-N-by-L.
% CARRIER is a configuration object of type, <a
% href="matlab:help('nrCarrierConfig')"
% >nrCarrierConfig</a>
% BWPCFG is a configuration object of type, <a
% href="matlab:help('nrWavegenBWPConfig')"
% >nrWavegenBWPConfig</a>
% CONFIGARRAY is an array of structures. Each structure contains the
% configuration and reference resource information. The contents of
% this structure are used for equalization, decoding, and building
% reference IQs.
% NSLOTS is the number of slots for which the REFGRID is to be
% generated
% PHYCHANNELTYPE is a character string with three possible strings
% ('PDSCH','PDCCH',PUSCH')
% Copyright 2022 The MathWorks, Inc.
genPdschRefGrid = strcmp(phyChannelType,'PDSCH');
genPdcchRefGrid = strcmp(phyChannelType,'PDCCH');
genPuschRefGrid = strcmp(phyChannelType,'PUSCH');
if isempty(configArray)
refGrid = [];
idealGrid = [];
return;
end
nSubcarriers = carrier.NSizeGrid * 12;
L = carrier.SymbolsPerSlot*nSlots; % Number of OFDM symbols in the reference grid
if genPdschRefGrid
nLayers = configArray(1).PDSCH.NumLayers;
elseif genPuschRefGrid
nLayers = configArray.PUSCH.NumLayers;
else
nLayers = 1;
end
bwpStart = bwpCfg.NStartBWP-carrier.NStartGrid;
bwpLen = bwpCfg.NSizeBWP;
if genPdschRefGrid
slotRange = [];
pdschConfigLen = numel(configArray);
for pIdx = 1:pdschConfigLen
if ~isempty(configArray(pIdx).Resources)
slotRange = [slotRange configArray(pIdx).Resources.NSlot]; %#ok<*AGROW>
end
end
slotRange = unique(slotRange);
else
slotRange = [configArray.Resources.NSlot];
end
refGrid = zeros(nSubcarriers,L,nLayers); % empty grid
bwpGrid = zeros(bwpLen*12,L,nLayers);
resPerSlot = bwpLen*12*carrier.SymbolsPerSlot;
% Create 'idealGrid'
if genPdschRefGrid || genPuschRefGrid
idealGrid = zeros(nSubcarriers,L,nLayers);
idealBwpGrid = zeros(bwpLen*12,L,nLayers);
end
% Populate the DM-RS symbols in the reference grid for all slots
% Place the bwpGrid in a carrier grid (at an appropriate
% location) in case the BWP size is not the same as the carrier grid
for slotIdx=carrier.NSlot+(0:nSlots-1)
isDataSlot = ~isempty(find(slotIdx == slotRange,1));
if genPdschRefGrid
[dataInd,dataSym,dmrsIndices,dmrsSymbols] = hSlotResources(configArray,slotIdx);
elseif genPuschRefGrid
configArray.PUSCH.TransmissionScheme = 'nonCodeBook';
[~,dmrsIndices,dmrsSymbols,~,~,~] = ...
nr5g.internal.wavegen.PXSCHResources(bwpCfg, configArray.PUSCH, configArray.PUSCH.NID, slotIdx, [], []);
if isDataSlot
dIdx = find(slotIdx == slotRange,1);
dataInd = configArray.Resources(dIdx).ChannelIndices;
dataSym = configArray.Resources(dIdx).ChannelSymbols;
end
elseif genPdcchRefGrid
loc = find(slotIdx == slotRange);
if isempty(loc)
continue;
end
dmrsIndices = configArray.Resources(loc).DMRSIndices;
dmrsSymbols = configArray.Resources(loc).DMRSSymbols;
end
if ~isempty(dmrsIndices)
for layerIdx = 1:nLayers
if layerIdx <= size(dmrsIndices,2)
dmrsIndices(:,layerIdx) = dmrsIndices(:,layerIdx) - resPerSlot*(layerIdx -1)+ (L*bwpLen*12*(layerIdx-1));
% Power adjustment is needed only for PUSCH case
pwr = 1;
if genPuschRefGrid
pwr = db2mag(configArray.PUSCH.DMRSPower);
end
bwpGrid(dmrsIndices(:,layerIdx)+(slotIdx-carrier.NSlot)*resPerSlot) = dmrsSymbols(:,layerIdx)*pwr;
if isDataSlot && (genPdschRefGrid || genPuschRefGrid)
dataInd(:,layerIdx) = dataInd(:,layerIdx) - resPerSlot*(layerIdx -1)+ (L*bwpLen*12*(layerIdx-1));
idealBwpGrid(dataInd(:,layerIdx)+(slotIdx-carrier.NSlot)*resPerSlot) = dataSym(:,layerIdx);
end
end
end
refGrid(12*bwpStart+1:12*(bwpStart+bwpLen),:,:) = bwpGrid;
if genPdschRefGrid || genPuschRefGrid
idealGrid(12*bwpStart+1:12*(bwpStart+bwpLen),:,:) = idealBwpGrid;
end
end
end
end
⛳️ 运行结果
🔗 参考文献
[1] 古筝.追踪被篡改原图信息的数字水印算法研究[D].北京邮电大学,2015.
[2] 高宝建,翟瑞瑛,杨艳萍.基于DCT变换的码分多址图像数字水印算法[J].西北大学学报(自然科学版), 2007.DOI:JournalArticle/5aeb20a8c095d70944ff6391.
[3] 汪太月,李宏伟.基于DCT变换的彩色图像置乱数字水印算法[J].通信技术, 2014, 47(9):6.DOI:10.3969/j.issn.1002-0802.2014.09.022.
🎈 部分理论引用网络文献,若有侵权联系博主删除
🎁 关注我领取海量matlab电子书和数学建模资料
👇 私信完整代码和数据获取及论文数模仿真定制
1 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化、背包问题、 风电场布局、时隙分配优化、 最佳分布式发电单元分配、多阶段管道维修、 工厂-中心-需求点三级选址问题、 应急生活物质配送中心选址、 基站选址、 道路灯柱布置、 枢纽节点部署、 输电线路台风监测装置、 集装箱船配载优化、 机组优化、 投资优化组合、云服务器组合优化、 天线线性阵列分布优化、CVRP问题、VRPPD问题、多中心VRP问题、多层网络的VRP问题、多中心多车型的VRP问题、 动态VRP问题、双层车辆路径规划(2E-VRP)、充电车辆路径规划(EVRP)、油电混合车辆路径规划、混合流水车间问题、 订单拆分调度问题、 公交车的调度排班优化问题、航班摆渡车辆调度问题、选址路径规划问题
2 机器学习和深度学习方面
2.1 bp时序、回归预测和分类
2.2 ENS声神经网络时序、回归预测和分类
2.3 SVM/CNN-SVM/LSSVM/RVM支持向量机系列时序、回归预测和分类
2.4 CNN/TCN卷积神经网络系列时序、回归预测和分类
2.5 ELM/KELM/RELM/DELM极限学习机系列时序、回归预测和分类
2.6 GRU/Bi-GRU/CNN-GRU/CNN-BiGRU门控神经网络时序、回归预测和分类
2.7 ELMAN递归神经网络时序、回归\预测和分类
2.8 LSTM/BiLSTM/CNN-LSTM/CNN-BiLSTM/长短记忆神经网络系列时序、回归预测和分类
2.9 RBF径向基神经网络时序、回归预测和分类