我编写了下面的代码,它采用图像的 Haar 变换并在系数的最低有效位中逐位嵌入秘密消息。要使用 bitset 函数,我将双系数转换为 uint64,并在嵌入后将它们改回。
function DwtSteg(address,message)
coverImage=imread(address);
ascii=uint8(message);
[LL LH HL HH]=dwt2(coverImage,'haar');
LH=round(LH);
HL=round(HL);
subplot(1,2,1)
imshow(LH)
[r c]=size(LL);
wc=1;
bc=1;
done=false;
for i=1:r
if(done)
break
end
for j=1:c
if(bc==8)
bc=1;
wc=wc+1;
end
if(wc==length(message))
done=true;
break;
end
xb = typecast(LH(i,j), 'uint64' );
xb=bitset(xb,1,bitget(ascii(wc),bc));
xb%***
LH(i,j)=typecast(xb, 'double');
bc=bc+1;
end
end
subplot(1,2,2)
imshow(LH)
stegoImage=idwt2(LL ,HL,LH, HH,'haar');
figure(2)
imshow(uint8(stegoImage));
imwrite(uint8(stegoImage),'stegoImage.tiff');
end
但是当我运行下面的代码以从图像中提取我的消息时。系数与转换后的系数不同。(在两个函数上都考虑 '***'):
function [ str ] = DwtDesteg( address)
str='';
image=imread(address);
[LL LH HL HH]=dwt2(image,'haar');
[r c]=size(LL);
LH=round(LH);
bc=1;
ch=0;
for i=1:r
for j=1:c
if(bc==8)
bc=1;
str=strcat(str,ch);
char(ch)
end
xb = typecast(LH(i,j), 'uint64');
xb%***
ch=bitset(ch,bc,bitget(xb,1));
bitget(xb,1)
bc=bc+1;
end
end
end