一、源代码
%Main embedding code of the steganography method
%It is written by:Souradeep Mukhopadhyay
%Mail:souradeepmukhopadhyay99@gmail.com
%Phone:6291028852
clc;
clear all;
my_image=imread('Picture 13623416.jpg');
secret_image=imread('Picture 13623416.jpg');
headerlength=32;
[R,C]=size(my_image);
% [R1,C1]=size(secret_image);
[s,k]=size(secret_image);
watermarklength=s*k;
slength=uint8(headerlength/2);
klength=uint8(headerlength-slength);
slengthbits=dec2bin(s,slength);
slengthbits=reshape(slengthbits',[],1);
klengthbits=dec2bin(k,klength);
klengthbits=reshape(klengthbits',[],1);
sizebits=uint8(zeros(headerlength,1));
for j=1:uint8(headerlength)
if(j<=slength)
sizebits(j)=uint8(slengthbits(j)-48);
else
sizebits(j)=uint8(klengthbits(j-klength)-48);
end
end
actualbits=dec2bin(secret_image);
actualbits=reshape(actualbits',[],1);
totalnoofbitstobeembedded=watermarklength*8+headerlength;
for i=1:totalnoofbitstobeembedded
if(i<=headerlength)
watermarkbits(i)=uint8(sizebits(i));
else
watermarkbits(i)=uint8(actualbits(i-headerlength)-48);
end
end
blocksizeR=1;
blocksizeC=3;
wholeBlockRows = ceil(R / blocksizeR);
wholeBlockCols = ceil(C / blocksizeC);
% blocksize=2;
% wholeBlockRows = floor(R / blocksize);
% wholeBlockCols = floor(C / blocksize);
% padding if the image is not divisible by block size
if rem(R,blocksizeR)==0
effectiveblocksizeR=rem(R,blocksizeR);
else
effectiveblocksizeR=blocksizeR-rem(R,blocksizeR);
end
if rem(C,blocksizeC)==0
effectiveblocksizeC=rem(C,blocksizeC);
else
effectiveblocksizeC=blocksizeC-rem(C,blocksizeC);
end
my_image = padarray(my_image, [effectiveblocksizeR effectiveblocksizeC], 'replicate','pre');
%imwrite(my_image,'E:\Dr. Ram Sarkar\MATLAB_SKG_PROG\ori_resize\lena512_gray_pad.bmp');
[R,C]=size(my_image);
bin=zeros(R,C,'uint8');
flag=0;
traversedbit=1;
traversedbit=uint32(traversedbit);
noOfbitEmbedded=[3 2 4];
% loop over all rows and columns
for i=1:wholeBlockRows
for j=1:wholeBlockCols
% get the block
one_block=my_image((i-1)*blocksizeR+[1:blocksizeR],(j-1)*blocksizeC+[1:blocksizeC]);
%Transform the block
tn_one_block=uint32(LT(uint32(one_block)));
backup_tn_one_block=tn_one_block;
for m=1:blocksizeR
for n=1:blocksizeC
freqcom=tn_one_block(m,n);
% backupfreqcom=freqcom;
for l=1:noOfbitEmbedded(m*n)
if(traversedbit<=totalnoofbitstobeembedded)
if watermarkbits(traversedbit)==1
freqcom=bitor(freqcom,(2^(l-1)));
else
freqcom=bitand(freqcom,bitcmp((2^(l-1)),'uint16'));
end
% tn_one_block(m,n)=freqcom;
traversedbit=traversedbit+1;
else
flag=1;
break;
end
if(flag)
break;
end
end
if(flag)
break;
end
tn_one_block(m,n)=freqcom;
end
end
tn_one_block(1,1)=frequencyAdjustment(backup_tn_one_block(1,1),tn_one_block(1,1),noOfbitEmbedded(1));
tn_one_block(1,2)=frequencyAdjustment(backup_tn_one_block(1,2),tn_one_block(1,2),noOfbitEmbedded(2));
tn_one_block(1,3)=frequencyAdjustment(backup_tn_one_block(1,3),tn_one_block(1,3),noOfbitEmbedded(3));
In_one_block=uint32(ILT(int32(tn_one_block)));
for m=1:blocksizeR
for n=1:blocksizeC
pixelval=In_one_block(m,n);
bin((i-1)*blocksizeR+m,(j-1)*blocksizeC+n)=pixelval;
end
end
end
end
imshow(bin);
% PSNR=psnr(my_image,bin)
%imwrite(bin,'E:\Dr. Ram Sarkar\MATLAB_SKG_PROG\stego_resize\lena512_gray_stego.bmp');
二、运行结果
三、备注
版本:2014a