【图像隐写】LDPC编码译码改进DCT水印嵌入提取【含Matlab源码 832期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞💞💞💞💞💞💞💞💞💥💥💥💥💥💥💥💥
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
在这里插入图片描述
🔊博主简介:985研究生,Matlab领域科研开发者;

🚅座右铭:行百里者,半于九十。

🏆代码获取方式:
优快云 Matlab武动乾坤—代码获取方式

更多Matlab图像处理仿真内容点击👇
Matlab图像处理(进阶版)

⛳️关注优快云 Matlab武动乾坤,更多资源等你来!!

⛄一、DCT数字水印嵌入与提取简介

1 基本DCT变换
目前,基于DCT域的水印方法已经成为数字水印算法研究的热点,它的核心思想就是通过离散傅立叶变换对图像块进行处理后,再选择变换域中的一些系数值依据一定规则来嵌入水印。
由于图像块中DCT系数频带分布由左上角的直流分量DC往下对应的系数频率由低频升至高频,因此在不影响原图质量的前提下,可将水印信息根据能量大小嵌入相应系数频带中。通过图像块量化与水印嵌入结合的处理方法将水印信息均匀分布在图像的整个空间域,在图像裁剪和滤波方面,变换域的水印比在空间域的更能表现出一定的鲁棒性。

2 水印算法描述
2.1 水印嵌入算法
该算法采用加性嵌入的方式在经过DCT变换后的子图像块的中频域中,选取隐秘位置嵌入水印信息,具体的嵌入流程如下图1所示:
在这里插入图片描述
图1 分块水印嵌入流程
(1)分块处理:设宿主图像为P,将其分块处理为8*8的K个子块。
(2)水印预处理:设水印图像为W,对其进行互补变换,变换后的水印图像和变换前的水印图像相互补。
(3)对水印图像进行Arnold置乱变换,并依据混沌映射规则,选取密钥混沌序列并与水印序列异或运算,将置换次数和异或运算处理后的结果分别作为水印嵌入算法的密钥1和密钥2。
(4)DCT变换:对各子块内做DCT变换,利用zig-zag对DCT系数进行扫描,得到第k块子图像块的序列为Zk(i),i=0,1,2,…63.
(5)水印嵌入算法:依据zig-zag排序,在各子块的中、低频段选取特定系数x(m)和x(n),在系数坐标(a,b)和(c,d)处嵌入水印信息图像W,并将其作为密钥3。同理,嵌入互补水印图片W’,并将嵌入的位置作为密钥4。水印嵌入的方法如下:
在这里插入图片描述
在这里插入图片描述
(6)IDCT变换:将每一个子图像块作二维DCT逆变换。
(7)子块合并:将每一个子块合并成嵌入水印的图像P’。

2.2 水印提取算法
将嵌入水印的图像P’分块处理,并对各子块进行二维DCT变换,由密钥3和4推断所选择的水印系数,若x(m)≤x(n),则水印信息为0,若x(m)>x(n),则水印信息为1,再利用密钥1和2将初步水印的信息解密再进行Arnold逆变换,最终提取出水印信息。

2.3 水印检测算法
本文通过计算峰值信噪比PSNR的值评价嵌入水印的宿主图像的质量,一幅m和n的图像,PSNR度量标准定义为:
在这里插入图片描述
归一化相关系数NC的值判断嵌入水印的图像与宿主图像的相似度,其定义为:
在这里插入图片描述
在这里插入图片描述

⛄二、部分源代码

close all;
clc;
clear all
warning off
%-----------------读入"隐藏的图片"---------------------
I=imread(‘W.bmp’);
%-----------------------读入"载体图像"-------------------------
cover_image=imread(‘lena.bmp’);
%------------------------------------------------------------------
I0=rgb2gray(I);%灰度化

cover_image=rgb2gray(cover_image);%灰度化
[wm0,watermarked_image,wm]=ldpc_dct(I0,cover_image);%ldpc_dct嵌入提取
e=wm0-wm;
[m,n]=size(e);
mse=sum((e(😃.^2))/(mn);
psnr=10
log10(255^2/mse);%原始水印与提取水印的峰值信噪比
% disp([‘ldpc改进dct提取水印的峰值信噪比psnr=’,num2str(psnr)])
figure(1)
subplot(221)
imshow(cover_image);
title(‘原图’);
subplot(222);
imshow(I0);
title(‘水印图’);
title(‘水印图’);
%显示嵌入水印后的图象
subplot(223);
uint8_watermarked_image=uint8(watermarked_image);
imshow(uint8_watermarked_image)
title(‘ldpc编码译码改进后嵌入水印图’)
subplot(224);
imshow(double(wm));
title(‘ldpc编码译码改进后提取水印图’)
%% 剪切攻击
I_jianqie=I0;%剪切图
I_jianqie(20:30,20:40)=256;
[wm_jianqie0,watermarked_image_jianqie,wm_jianqie]=ldpc_dct(I_jianqie,cover_image);%ldpc_dct嵌入提取
e_jianqie=wm_jianqie0-wm_jianqie;
[m,n]=size(e_jianqie);
mse_jianqie=sum((e_jianqie(😃.^2))/(mn);
psnr_jianqie=10
log10(255^2/mse_jianqie);%原始水印与提取水印的峰值信噪比
% disp([‘攻击后峰值信噪比psnr=’,num2str(psnr_jianqie)])
figure(2)
subplot(221)
imshow(cover_image);
title(‘原图’);
subplot(222);
imshow(I0);
title(‘水印图’);
%显示嵌入水印后的图象
subplot(223);
uint8_watermarked_image_jianqie=uint8(watermarked_image_jianqie);
imshow(uint8_watermarked_image_jianqie)
title(‘剪切攻击后嵌入水印图’)
subplot(224);
imshow(double(wm_jianqie));
title(‘剪切攻击后提取水印图’)
%% 高斯噪声
I_gaosi=imnoise(I0,‘gaussian’,0,0.01);%高斯加噪
[wm_gaosi0,watermarked_image_gaosi,wm_gaosi]=ldpc_dct(I_gaosi,cover_image);%ldpc_dct嵌入提取
e_gaosi=wm_gaosi0-wm_gaosi;
[m,n]=size(e_gaosi);
mse_gaosi=sum((e_gaosi(😃.^2))/(mn);
psnr_gaosi=10
log10(255^2/mse_gaosi);%原始水印与提取水印的峰值信噪比
% disp([‘高斯噪声攻击后峰值信噪比psnr=’,num2str(psnr_gaosi)])
figure(3)
subplot(221)
imshow(cover_image);
title(‘原图’);
subplot(222);
imshow(I0);
title(‘水印图’);

%显示嵌入水印后的图象
subplot(223);
uint8_watermarked_image_gaosi=uint8(watermarked_image_gaosi);
imshow(uint8_watermarked_image_gaosi)
title(‘高斯噪声攻击后嵌入水印图’)
subplot(224);
imshow(double(wm_gaosi));
title(‘高斯噪声攻击后提取水印图’)
%% 旋转攻击
%%9.rotate 45 旋转
I_xuanzhuan=imrotate(I0,45,‘bilinear’,‘crop’);%旋转45度
[wm_xuanzhuan0,watermarked_image_xuanzhuan,wm_xuanzhuan]=ldpc_dct(I_gaosi,cover_image);%ldpc_dct嵌入提取
e_xuanzhuan=wm_xuanzhuan0-wm_xuanzhuan;
[m,n]=size(e_xuanzhuan);
mse_xuanzhuan=sum((e_xuanzhuan(😃.^2))/(mn);
psnr_xuanzhuan=10
log10(255^2/mse_xuanzhuan);%原始水印与提取水印的峰值信噪比
% disp([‘旋转攻击后峰值信噪比psnr=’,num2str(psnr_xuanzhuan)])
figure(4)
subplot(221)
imshow(cover_image);
title(‘原图’);
subplot(222);
imshow(I0);
title(‘水印图’);
function H = makeLdpc(M, N, method, noCycle, onePerCol)
% Create R = 1/2 low density parity check matrix
%
% M : Number of row
% N : Number of column
% method : Method for distributing non-zero element
% {0} Evencol : For each column, place 1s uniformly at random
% {1} Evenboth: For each column and row, place 1s uniformly at random
% noCyle : Length-4 cycle
% {0} Ignore (do nothing)
% {1} Eliminate
% onePerCol: Number of ones per column
%
% H : Low density parity check matrix
%
%
% Copyright Bagawan S. Nugroho, 2007
% http://bsnugroho.googlepages.com

% Number of ones per row (N/M ratio must be 2)
if N/M ~= 2
fprintf(‘Code rate must be 1/2\n’);
end
onePerRow = (N/M)*onePerCol;

% fprintf(‘Creating LDPC matrix…\n’);

switch method
% Evencol
case {0}
% Distribute 1s uniformly at random within column
for i = 1:N
onesInCol(:, i) = randperm(M)';
end

  % Create non zero elements (1s) index
  r = reshape(onesInCol(1:onePerCol, :), N*onePerCol, 1);
  tmp = repmat([1:N], onePerCol, 1);
  c = reshape(tmp, N*onePerCol, 1);
  
  % Create sparse matrix H
  H = full(sparse(r, c, 1, M, N));

% Evenboth
case {1}
% Distribute 1s uniformly at random within column
for i = 1:N
onesInCol(:, i) = randperm(M)';
end

  % Create non zero elements (1s) index
  r = reshape(onesInCol(1:onePerCol, :), N*onePerCol, 1);
  tmp = repmat([1:N], onePerCol, 1);
  c = reshape(tmp, N*onePerCol, 1);
 
  % Make the number of 1s between rows as uniform as possible     
  
  % Order row index
  [r, ix] = sort(r);
  
  % Order column index based on row index
  for i = 1:N*onePerCol
     cSort(i, :) = c(ix(i));
  end
  
  % Create new row index with uniform weight
  tmp = repmat([1:M], onePerRow, 1);
  r = reshape(tmp, N*onePerCol, 1);
  
  % Create sparse matrix H
  % Remove any duplicate non zero elements index using logical AND
  S = and(sparse(r, cSort, 1, M, N), ones(M, N));
  H = full(S);     

end % switch

% Check rows that have no 1 or only have one 1
for i = 1:M

n = randperm(N);
% Add two 1s if row has no 1
if length(find(r == i)) == 0
H(i, n(1)) = 1;
H(i, n(2)) = 1;
% Add one 1 if row has only one 1
elseif length(find(r == i)) == 1
H(i, n(1)) = 1;
end

end % for i

% If desired, eliminate any length-4 cycle
if noCycle == 1

for i = 1:M
% Look for pair of row - column
for j = (i + 1):M
w = and(H(i, 😃, H(j, 😃);
c1 = find(w);
lc = length(c1);
if lc > 1

        % If found, flip one 1 to 0 in the row with less number of 1s
        if length(find(H(i, :))) < length(find(H(j, :)))
           % Repeat the process until only one column left 
           for cc = 1:lc - 1
              H(j, c1(cc)) = 0;
           end

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]万谊丹.基于Arnold和DCT的抗剪切攻击图像水印研究[J].网络安全技术与应用. 2021,(08)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值