频域图像三点法信息嵌入
通过第三次上机实验,已经对频域嵌入水印有一定的了解,本节将再次基础上进行优化,提出三点法的嵌入,利用DCT中频域中的三个系数之间的相对关系来对秘密信息进行编码,具体如下:
选择三个位置(u1,v1),(u2,v2),(u3,v3)
嵌入1:令B(u1,v1)>B(u2,v2)+D,B(u2,v2)>B(u3,v3)+D,
嵌入0:令B(u1,v1)<B(u2,v2)-D,B(u2,v2)<B(u3,v3)-D,
如果数据不符合,则修改这三个系数值,使得它们满足上述关系。
如果需要做的修改太大,则放弃该块,将其标识为无效。
其中参数D的选择要考虑隐藏的健壮性和不可察觉性之间的平衡,D越大,隐藏算法对于图像处理就越健壮,但是对图像的改动就越大,越容易引起察觉。
标记为“无效”的处理:
对这三个系数做小量的修改使得它们满足下面条件之一:
B(u1,v1) <=B(u3,v3) <=B(u2,v2) 或者 B(u2,v2) <=B(u3,v3) <=B(u1,v1)
要求:
结合上次实验,实现离散小波变换(DWT)和离散傅里叶变换(DFT)用三点发嵌入水印,对alpha和D的大小进行调节,再进行stirmark攻击,比较水印的正确率。
攻击包括(旋转,JPEG,高斯噪音)
Alpha和D的值自行选择,每个选取5个值,并对结果进行分析。
【实验环境】
natlab/python stirmark工具
【实验步骤】
1、编写实现DCT三点法matlab代码
成功提取隐藏信息
2、对水印图片进行stirmark攻击
2、挑选其中几个,均无法提取出隐藏信息。
3、仿照代码编写DWT代码,但尝试多个lumda后提取出来的仍为乱码,无法实现。
4、由于实验三中的DFT中,修改频域系数后,导致频域数据不共轭对称,无法正确逆变换,没有实现DFT的实现算法。
【实验代码】
Lab4.m
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
| clc;
clear;
msgfid=fopen('myhidden.txt','r');
[msg,count]= fread(msgfid,'ubit1');
disp(msg);
disp(count);
alpha=0.02;
fclose(msgfid);
io=imread('lena.bmp');
io=double(io)/255;
output=io;
il=io(:,:,1);
T=dctmtx(8);
DCTrgb=blkproc(il,[8 8],'P1*x*P2',T,T');
[row,col]=size(DCTrgb);
row=floor(row/8);
col=floor(col/8);
disp(DCTrgb);
lumda=0.6;
for i=1:count
if msg(i,1)==0
if (DCTrgb(i+4,i+1)>DCTrgb(i+3,i+2)-lumda) || DCTrgb(i+5,i+6)>(DCTrgb(i+3,i+2)-lumda)
DCTrgb(i+3,i+2)=max(DCTrgb(i+4,i+1)+lumda,DCTrgb(i+5,i+6)+lumda)+1;
end
else
if (DCTrgb(i+4,i+1)<DCTrgb(i+3,i+2)+lumda) || DCTrgb(i+5,i+6)<(DCTrgb(i+3,i+2)+lumda)
DCTrgb(i+3,i+2)=min(DCTrgb(i+4,i+1)-lumda,DCTrgb(i+5,i+6)-lumda)-1;
end
end
end
wi=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T);
output=io;
output(:,:,1)=wi;
imwrite(output,'watermarkedlena.bmp');
|
Lab4decode.m
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
| clc;
wi=imread('watermarkedlena_JPEG_90.bmp');
wi=double(wi)/255;
wi=wi(:,:,1);
T=dctmtx(8);
DCTcheck=blkproc(wi,[8 8],'P1*x*P2',T,T');
frr=fopen('111.txt','a');
disp(DCTcheck);
lumda=0.6;
for i=1:128
if DCTcheck(i+4,i+1)<DCTcheck(i+3,i+2)-lumda && DCTcheck(i+5,i+6)<DCTcheck(i+3,i+2)-lumda
fwrite(frr,0,'ubit1');
result(i,1)=0;
elseif DCTcheck(i+4,i+1)>DCTcheck(i+3,i+2)+lumda && DCTcheck(i+5,i+6)>DCTcheck(i+3,i+2)+lumda
fwrite(frr,1,'ubit1');
result(i,1)=1;
else
continue
end
end
fclose(frr);
|
Lab4DWT.m
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
| clc;
clear;
msgfid=fopen('hidden.txt','r');
[msg,count]= fread(msgfid,'ubit1');
disp(msg);
disp(count);
alpha=0.02;
fclose(msgfid);
io=imread('lena.bmp');
io=double(io)/255;
output=io;
io=io(:,:,1);
[cA,cH,cV,cD]=dwt2(io,'haar');
disp(cH);
disp(cV);
si=size(cH);
lumda=0.008;
temp=0;
for i=1:count
if msg(i,1)==0
if (cV(i+2)>cV(i+4)-lumda) || cV(i+6)>(cV(i+4)-lumda)
cV(i+4)=max(cV(i+2)+lumda,cV(i+6)+lumda)+1;
end
else
if (cV(i+2)<cV(i+4)+lumda) || cV(i+6)<(cV(i+4)+lumda)
cV(i+4)=min(cV(i+2)-lumda,cV(i+6)-lumda)-1;
end
end
end
disp(cV);
code1=idwt2(cA,cH,cV,cD,'haar');
output(:,:,1)=code1;
imwrite(output,'DWT3fig.bmp');
|
Lab4DWTde.m
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
| clc;
wi=imread('DWT3fig.bmp');
wi=double(wi)/255;
wi=wi(:,:,1);
[cA,cH,cV,cD]=dwt2(wi,'haar');
frr=fopen('333.txt','a');
lumda=0.008;
for i=1:128
if cV(i+2)<cV(i+4)-lumda && cV(i+6)<cV(i+4)-lumda
fwrite(frr,0,'ubit1');
result(i,1)=0;
elseif cV(i+2)>cV(i+4)+lumda && cV(i+6)>cV(i+4)+lumda
fwrite(frr,1,'ubit1');
result(i,1)=1;
else
continue
end
end
fclose(frr);
|