【图像隐写】基于matlab分层自嵌入数字水印内容认证与恢复【含Matlab源码 1641期】

news/2025/1/15 14:08:09/

⛄一、分层自嵌入数字水印内容认证与恢复简介

为了保护图像数据的完整性、对图像进行认证和内容恢复,论文在分析数字水印研究现状和基本理论的基础上,提出一种分层自嵌入数字水印的内容认证和恢复算法。
文章的创新点在于算法在图像的变换域和空间域分层嵌入含有图像自身信息的恢复水印和认证水印,兼具了图片抵抗一定程度图像操作的鲁棒性要求和被篡改部位全盲检测的要求。同时,算法对图像进行分层篡改检测,准确检测出被篡改区域。除此之外,算法利用嵌入的水印,依据恢复精度分层恢复图像内容,极大地增加了图像内容的恢复能力,在图像遭受大面积篡改时也能达到较高的恢复效果。
实验结果表明,论文算法在抵抗剪切攻击和拼贴攻击方面有良好的表现,在剪切面积高达90%的情况下,对图像内容恢复程度能达到60%以上。同时,算法能抵抗JPEG压缩、加入噪声、中值滤波攻击,鲁棒性良好。

⛄二、部分源代码

clear;
q1=64; %第一层水印嵌入强度
key1=13; %第三层水印分块映射位置密钥
Fy=[8 6 6 8 %44量化表
2 6 7 7
4 6 8 7
7 5 4 5];
Fyy=[16 11 10 16 24 40 51 61 %8
8量化表
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99];

%%%%对原始图片进行修改%%%%
attack_pic();

PIC=imread(‘PIC_change.bmp’);
if ndims(PIC)==3
PIC=rgb2gray(PIC);
end
figure(1);subplot(142);imshow(PIC);title(‘修改后的图片’);

[M,N]=size(PIC);
X2=mapping44(M,N,key1);%找到4*4分块的映射位置
%%%%分层图像内容认证%%%%
[sign4]=recovery_authentication(PIC,X2);

%%%%%%%%%%%%%%%%%内容恢复%%%%%%%%%%%%%%
xx=[1,1,3,3];
yy=[1,3,1,3];
a1=PIC;
sign5=sign4;
%存有被毁坏分块信息的分块未被毁坏,提取出第三层水印信息
for i=1:4:M
for j=1:4:N
if sign4(ceil(i/4),ceil(j/4))==1
x=floor(X2(ceil(i/4),ceil(j/4))/(N/4));
y=mod(X2(ceil(i/4),ceil(j/4)),N/4);
if sign4(x+1,y+1)==0
%第三层水印恢复信息
R=PIC(4x+1:4x+4,4y+1:4y+4);
for k=1:4
rrr(k6-4)=mod(R(xx(k),yy(k)+1),2);
rrr(k
6-5)=(mod(R(xx(k),yy(k)+1),4)-rrr(k6-4))/2;
rrr(k
6-2)=mod(R(xx(k)+1,yy(k)),2);
rrr(k6-3)=(mod(R(xx(k)+1,yy(k)),4)-rrr(k6-2))/2;
rrr(k6)=mod(R(xx(k)+1,yy(k)+1),2);
rrr(k
6-1)=(mod(R(xx(k)+1,yy(k)+1),4)-rrr(k*6))/2;
end
Q1=zeros(4,4);
Q1(1,1)=typecast(uint8(bin2dec(num2str(rrr(1:8)))), ‘int8’);
Q1(1,2)=typecast(uint8(bin2dec(num2str(rrr(9:16)))), ‘int8’);
Q1(2,1)=typecast(uint8(bin2dec(num2str(rrr(17:24)))), ‘int8’);
for ii=1:4
for jj=1:4
Q2(ii,jj)=Q1(ii,jj)Fy(ii,jj);
end
end
Q2=idct2(Q2);
a1(i:i+3,j:j+3)=Q2;
sign5(ceil(i/4),ceil(j/4))=0;
end
end
end
end
% 用于计算十进制数的补码
% 参数x:原始十进制数组,正负数皆可
% 参数n:输出的二进制补码最小位数,如果位数不够会根据x的取值范围自动扩展
% 输出值c:转换得到的二进制补码字符串数组
function [c] = complement(x,n)
for i = 1 : length(x)
if x(i) < 0
x(i) = x(i) + 2^n;
end
end
c = dec2bin(x, n)-‘0’;
end
function [sign4]=recovery_authentication(PIC1,X2)
%分层图像内容认证
Fy=[8 6 6 8 %4
4量化表
2 6 7 7
4 6 8 7
7 5 4 5];
[M,N]=size(PIC1);

for i=1:4:M
for j=1:4:N
Q=PIC1(i:i+3,j:j+3);
%第一层检测
signtemp=recovery_authentication_firstcheck(Q);
sign1(floor(i/2)+1,floor(j/2)+1)=signtemp(1);
sign1(floor(i/2)+1,floor(j/2)+2)=signtemp(2);
sign1(floor(i/2)+2,floor(j/2)+1)=signtemp(3);
sign1(floor(i/2)+2,floor(j/2)+2)=signtemp(4);
%第二层检测
if sum(signtemp)>=1
sign2(floor(i/4)+1,floor(j/4)+1)=1;
else
sign2(floor(i/4)+1,floor(j/4)+1)=0;
end
end
end

%第三层检测
sign3=sign2;
for i=2:M/4-1
for j=2:N/4-1
sum1=0;
if sign2(i,j)==0
sum1=sign2(i-1,j-1)+sign2(i-1,j)+sign2(i-1,j+1)+sign2(i,j-1)+sign2(i,j+1);
sum1=sum1+sign2(i+1,j-1)+sign2(i+1,j)+sign2(i+1,j+1);
if sum1>=5
sign3(i,j)=1;
end
end
end
end

%第四层检测
xx=[1,1,3,3];
yy=[1,3,1,3];
sign4=sign3;
for i=1:4:M
for j=1:4:N
if sign3(ceil(i/4),ceil(j/4))==0
x=floor(X2(ceil(i/4),ceil(j/4))/(N/4));
y=mod(X2(ceil(i/4),ceil(j/4)),N/4);
if sign3(x+1,y+1)==0
P3=PIC1(i:i+3,j:j+3);
P=P3-mod(P3,4); %每个像素最低三个有效位置0
P1=dct2§;
for ii=1:4
for jj=1:4
P2(ii,jj)=fix(P1(ii,jj)/Fy(ii,jj));
end
end
r=zeros(1,24);
r1 = complement(P2(1,1), 8); %前三个系数的补码生成24bit的恢复水印信息r
r2 = complement(P2(1,2), 8);
r3 = complement(P2(2,1), 8);
r=[r1,r2,r3];

            R1=PIC1(4*x+1:4*x+4,4*y+1:4*y+4);for k=1:4rr(k*6-4)=mod(R1(xx(k),yy(k)+1),2);rr(k*6-5)=(mod(R1(xx(k),yy(k)+1),4)-rr(k*6-4))/2;rr(k*6-2)=mod(R1(xx(k)+1,yy(k)),2);rr(k*6-3)=(mod(R1(xx(k)+1,yy(k)),4)-rr(k*6-2))/2;rr(k*6)=mod(R1(xx(k)+1,yy(k)+1),2);rr(k*6-1)=(mod(R1(xx(k)+1,yy(k)+1),4)-rr(k*6))/2;endif rr~=rsign4(ceil(i/4),ceil(j/4))=1;endendend        
end

end
figure(2);
subplot(141);imshow(sign1);title(‘第一层检测结果’);
subplot(142);imshow(sign2);title(‘第二层检测结果’);
subplot(143);imshow(sign3);title(‘第三层检测结果’);
subplot(144);imshow(sign4);title(‘第四层检测结果’);

⛄三、运行结果

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

⛄四、matlab版本及参考文献

1 matlab版本
2014a

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

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


http://www.ppmy.cn/news/405652.html

相关文章

​力扣解法汇总1641. 统计字典序元音字符串的数目

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你一个整数 n&#xff0c;请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且…

【LeetCode每日一题:1641. 统计字典序元音字符串的数目 | 从暴力递归=>记忆化搜索=>动态规划】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

[leetcode][1641]统计字典序元音字符串的数目

方法一&#xff1a;动态规划 思路与算法 状态表示&#xff1a;dp[i][j] 表示长度 i 1 的以元音字母 j 对应序号结尾的按字典序排序的字符串数量 初始状态&#xff1a;dp[0][j] 1&#xff0c;只有一个字符 状态方程&#xff1a; dp[i][j] 1, i 0 dp[i][j] Sum(j, k 0)…

【1641. 统计字典序元音字符串的数目】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个整数 n&#xff0c;请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。 字符串 s 按 字典序排列 需要满足&#xff1a;对于所有有效的 i&#xff0c;s[i] 在字…

Leetcode.1641 统计字典序元音字符串的数目

题目链接 Leetcode.1641 统计字典序元音字符串的数目 Rating &#xff1a; 1519 题目描述 给你一个整数 n&#xff0c;请返回长度为 n、仅由元音 (a, e, i, o, u)组成且按 字典序排列 的字符串数量。 字符串 s按 字典序排列 需要满足&#xff1a;对于所有有效的 i&#xff0c…

1641. 统计字典序元音字符串的数目(动态规划)

package com.wsq.dp; /*** 1641. 统计字典序元音字符串的数目* author wsq* date 2020/11/04给你一个整数 n&#xff0c;请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。字符串 s 按 字典序排列 需要满足&#xff1a;对于所有有效的 i&#xff…

面向对象抽象

抽象类 1 概念 Java中可以定义被abstract关键字修饰的方法,这种方法只有声明,没有方法体,叫做抽象方法. Java中可以定义被abstract关键字修饰的类,被abstract关键字修饰的类叫做抽象类 如果一个类含有抽象方法,那么它一定是抽象类 抽象类中的方法实现交给子类来完成 2 抽象…

Java并发(十)----线程之守护线程

默认情况下&#xff0c;Java 进程需要等待所有线程都运行结束&#xff0c;才会结束。有一种特殊的线程叫做守护线程&#xff0c;只要其它非守护线程运行结束了&#xff0c;即使守护线程的代码没有执行完&#xff0c;也会强制结束。 例&#xff1a; log.debug("开始运行.…