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

Posted 紫极神光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像隐写基于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('第三层检测结果'以上是关于图像隐写基于matlab分层自嵌入数字水印内容认证与恢复含Matlab源码 1641期的主要内容,如果未能解决你的问题,请参考以下文章

图像隐写基于matlab图像内容自恢复水印含Matlab源码 2321期

图像隐写基于matlab FFT数字水印嵌入含Matlab源码 1670期

图像隐写基于matlab DWT+IDWT数字水印嵌入+提取含Matlab源码 1530期

图像隐写基于matlab GBT+SVD数字水印嵌入与提取含Matlab源码 1668期

图像隐写基于matlab DWT数字水印嵌入+攻击+提取含Matlab源码 1759期

图像隐写基于matlab遗传算法的奇异值分解数字水印嵌入提取含Matlab源码 2115期