频域图像三点法信息嵌入

频域图像三点法信息嵌入

通过第三次上机实验,已经对频域嵌入水印有一定的了解,本节将再次基础上进行优化,提出三点法的嵌入,利用DCT中频域中的三个系数之间的相对关系来对秘密信息进行编码,具体如下:

img

选择三个位置(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代码

img

成功提取隐藏信息

img

2、对水印图片进行stirmark攻击

img

2、挑选其中几个,均无法提取出隐藏信息。

img

img

3、仿照代码编写DWT代码,但尝试多个lumda后提取出来的仍为乱码,无法实现。

img

img

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');%对图像分块进行DCT变换

[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); %对DCTrgbl进行逆变换

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');%对图像分块进行DCT变换

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');%使用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');%使用haar小波,

frr=fopen('333.txt','a');

% disp(cH);

% disp(cV);

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);

频域图像三点法信息嵌入
http://example.com/2022/12/31/频域图像三点法信息嵌入/
作者
Magnesium
发布于
2022年12月31日
许可协议