%This is the program of Reversible Data Hiding in Encrypted Domain clc; clear;
%===============Read image=========================== original_p=rgb2gray(imread('LENA.tif')); [m,n]=size(original_p);
%==============Image encryption====================== random_bits=rand(m,n*8)<=0.5; %伪随机序列 for i=1:m for j=1:n s=0; for k=0:7 b(k+1)=mod(fix(double(original_p(i,j))/(2^k)),2); eb(k+1)=xor(b(k+1),random_bits(i,8*j+k-7)); s=s+eb(k+1)*(2^k); end encrypted_image(i,j)=s; end end figure(1); subplot(1,2,1); imshow(original_p); hold on; title('Original image','fontsize',16); subplot(1,2,2); encrypted_image=uint8(encrypted_image); imshow(encrypted_image); title('Encrypted image','fontsize',16);
%================Data embedding====================== size=8; %分块大小 N=6;%置乱周期 number1=3; number2=N-number1; lim_row=fix(m/size); %图像的分块数 lim_col=fix(n/size); %图像的分块数 bitts=3; watermessage=rand(lim_row,lim_col)<0.5; %水印信息
%======pseudo_randomly======= for i=1:lim_row for j=1:lim_col block_image{i,j}=encrypted_image((size*i-size+1):size*i,(size*j-size+1):size*j); %分块 for k=1:size for t=1:size index=arnold(k,t,size,number1);%arnold is permutateion function; arno_block_image{i,j}(index(1)+1,index(2)+1)=block_image{i,j}(k,t); end end %数据嵌入 sum0=zeros(size/2,size); if watermessage(i,j)==0 for k=0:7 bbb{k+1}=mod(fix(double(arno_block_image{i,j}(1:size/2,:))/(2^k)),2); if kbbb{k+1}=~bbb{k+1}; end sum0=sum0+bbb{k+1}*(2^k); end data_image{i,j}=[sum0;double(arno_block_image{i,j}(size/2+1:size,:))]; end sum1=zeros(size/2,size); if watermessage(i,j)==1 for k=0:7 bbb{k+1}=mod(fix(double(arno_block_image{i,j}(size/2+1:size,:))/(2^k)),2); if kbbb{k+1}=~bbb{k+1}; end sum1=sum1+bbb{k+1}*(2^k); end data_image{i,j}=[double(arno_block_image{i,j}(1:size/2,:));sum1]; end for k=1:size for t=1:size index=arnold(k,t,size,number2);%arnold is permutateion function; re_data_image{i,j}(index(1)+1,index(2)+1)=data_image{i,j}(k,t); end end %合成嵌入数据后的图像 data_en_image((size*i-size+1):size*i,(size*j-size+1):size*j)=re_data_image{i,j}; end end %=====Encrypt image which contains data==== for i=1:lim_row*size for j=1:lim_col*size s=0; for k=0:7 b(k+1)=mod(fix(data_en_image(i,j)/(2^k)),2); eb(k+1)=xor(b(k+1),random_bits(i,8*j+k-7)); s=s+eb(k+1)*(2^k); end de_data_image(i,j)=s; end end figure(2); hold on; subplot(1,2,1); imshow(original_p); title('Original image','fontsize',16); subplot(1,2,2); imshow(uint8(de_data_image)); title('Decrypted image contains data','fontsize',16); %直接解密图像的峰值信噪比 sumsss=0; for i=1:lim_row*size for j=1:lim_col*size sumsss=(de_data_image(i,j)-double(original_p(i,j)))^2+sumsss; end end mse=sumsss/((lim_row*size)*(lim_row*size)); psnr=10*log10(255^2/mse);
%======Extract data and recover image======= for i=1:lim_row for j=1:lim_col block_de_image{i,j}=de_data_image((size*i-size+1):size*i,(size*j-size+1):size*j); %分块 for k=1:size for t=1:size index=arnold(k,t,size,number1);%arnold is permutateion function; ar_block_de_image{i,j}(index(1)+1,index(2)+1)=block_de_image{i,j}(k,t); end end sum0=zeros(size/2,size); sum1=zeros(size/2,size); for k=0:7 bbb0{k+1}=mod(fix(ar_block_de_image{i,j}(1:size/2,:)/(2^k)),2); bbb1{k+1}=mod(fix(ar_block_de_image{i,j}(size/2+1:size,:)/(2^k)),2); if kbbb0{k+1}=~bbb0{k+1}; bbb1{k+1}=~bbb1{k+1}; end sum0=sum0+bbb0{k+1}*(2^k); sum1=sum1+bbb1{k+1}*(2^k); end ar_H0_image{i,j}=[sum0;ar_block_de_image{i,j}(size/2+1:size,:)]; ar_H1_image{i,j}=[ar_block_de_image{i,j}(1:size/2,:);sum1]; for k=1:size for t=1:size index=arnold(k,t,size,number2);%arnold is permutateion function; H0_image{i,j}(index(1)+1,index(2)+1)=ar_H0_image{i,j}(k,t); H1_image{i,j}(index(1)+1,index(2)+1)=ar_H1_image{i,j}(k,t); end end f0=0; f1=0; for u=2:size-1 for v=2:size-1
f0=f0+abs(H0_image{i,j}(u,v)-(H0_image{i,j}(u-1,v)+H0_image{i,j}(u,v-1)+H0_image{i,j}(u+1,v)+H0_image{i,j}(u,v+1))/4);
f1=f1+abs(H1_image{i,j}(u,v)-(H1_image{i,j}(u-1,v)+H1_image{i,j}(u,v-1)+H1_image{i,j}(u+1,v)+H1_image{i,j}(u,v+1))/4); end end if (f0-f1)<0 extract_bits(i,j)=0; recover_image(size*i-size+1:size*i,size*j-size+1:size*j)=H0_image{i,j}; else extract_bits(i,j)=1; recover_image(size*i-size+1:size*i,size*j-size+1:size*j)=H1_image{i,j}; end end end figure(3); subplot(1,2,1); imshow(original_p); hold on;