【图像隐写】基于matlab分层自嵌入数字水印内容认证与恢复【含Matlab源码 1641期】
一、分层自嵌入数字水印内容认证与恢复简介
为了保护图像数据的完整性、对图像进行认证和内容恢复,论文在分析数字水印研究现状和基本理论的基础上,提出一种分层自嵌入数字水印的内容认证和恢复算法。
文章的创新点在于算法在图像的变换域和空间域分层嵌入含有图像自身信息的恢复水印和认证水印,兼具了图片抵抗一定程度图像操作的鲁棒性要求和被篡改部位全盲检测的要求。同时,算法对图像进行分层篡改检测,准确检测出被篡改区域。除此之外,算法利用嵌入的水印,依据恢复精度分层恢复图像内容,极大地增加了图像内容的恢复能力,在图像遭受大面积篡改时也能达到较高的恢复效果。
实验结果表明,论文算法在抵抗剪切攻击和拼贴攻击方面有良好的表现,在剪切面积高达90%的情况下,对图像内容恢复程度能达到60%以上。同时,算法能抵抗JPEG压缩、加入噪声、中值滤波攻击,鲁棒性良好。
二、部分源代码
clear;
q1=64; %第一层水印嵌入强度
key1=13; %第三层水印分块映射位置密钥
Fy=[8 6 6 8 %4*4量化表
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(4*x+1:4*x+4,4*y+1:4*y+4);
for k=1:4
rrr(k*6-4)=mod(R(xx(k),yy(k)+1),2);
rrr(k*6-5)=(mod(R(xx(k),yy(k)+1),4)-rrr(k*6-4))/2;
rrr(k*6-2)=mod(R(xx(k)+1,yy(k)),2);
rrr(k*6-3)=(mod(R(xx(k)+1,yy(k)),4)-rrr(k*6-2))/2;
rrr(k*6)=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(P);
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:4
rr(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;
end
if rr~=r
sign4(ceil(i/4),ceil(j/4))=1;
end
end
end
end
end
figure(2);
subplot(141);imshow(sign1);title('第一层检测结果');
subplot(142);imshow(sign2);title('第二层检测结果');
subplot(143);imshow(sign3);title('第三层检测结果');
subplot(144);imshow(sign4);title('第四层检测结果');
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]万谊丹.基于Arnold和DCT的抗剪切攻击图像水印研究[J].网络安全技术与应用. 2021,(08)
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/122156798
- 点赞
- 收藏
- 关注作者
评论(0)