频域图像水印

频域图像水印

【实验目的】

了解频域水印的特点,掌握基于DCT系数关系的图像水印算法原理,设计并实现一种基于DCT域的图像水印算法。

【实验环境】

natlab/python stirmark工具

【实验原理】

在信号的频域(变换域)中隐藏信息要比在时域中嵌入信息具有更好的鲁棒性。一副图像经过时域到频域的变换后,可将待隐藏信息藏入图像的显著区域,这种方法比LSB以及其他一些时域水印算法更具抗攻击能力,而且还保持了对人类感官的不可察觉性。常用的变换域方法有离散余弦变换(DCT)、离散小波变换(DWT)和离散傅里叶变换(DFT)等。

本章介绍一种提取秘密信息的时候不需要原始图像的盲水印算法,算法的思想是利用载体中两个特定DCT系数的相对大小来表示隐藏的信息。载体图像分为8×8分块,进行二维DCT变换,分别选择其中的两个位置,比如用(u1,v1)和(u2,v2)代表所选定的两个系数的坐标。如果Bi(u1,v1)<Bi(u2,v2),代表隐藏1;如果相反,则交换两系数。如果Bi(u1,v1)>Bi(u2,v2),代表隐藏0;如果相反,则交换两系数。提取的时候接收者对包含水印的图像文件进行二维DCT变换,比较每一块中约定位置的DCT系数值根据其相对大小得到隐藏信息的比特串,从而恢复出秘密信息。但是在使用上述算法的过程中,如果有一对系数大小相差非常少,往往难以保证携带图像在保存和传输的过程中以及提取秘密信息的过程中不发生变化。因此在实际的设计过程中,一般都是引入一个Alpha变量对系数的差值进行控制,将两个系数的差值放大,可以保证提取秘密信息的正确性。

Dct嵌入水印代码(hiding.m)和提取水印代码(extract.m)已提供,hidden.txt里是嵌入水印的信息,提取到111.txt文件中

要求:

1、 计算原图与水印图片之间的PSNR。

2、 仿照dct变化的代码,实现离散小波变换(DWT)和离散傅里叶变换(DFT)嵌入水印的代码,并计算PSNR,嵌入信息为学号姓名。

hiding.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
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;
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);
%顺序信息嵌入
temp =0;
for i=1:count
if msg(i,1)==0
if DCTrgb(i+4,i+1)<DCTrgb(i+3,i+2) %选择(5,2)和(4,3)这一对系数
temp =DCTrgb(i + 4,i + 1);
DCTrgb(i + 4,i + 1)=DCTrgb(i+3,i+2);
DCTrgb(i+3,i+2)=temp;
end
else
if DCTrgb(i +4,i +1)>DCTrgb(i +3,i +2)
temp=DCTrgb(i +4,i +1);
DCTrgb(i +4,i +1)=DCTrgb(i +3,i +2);
DCTrgb(i +3,i +2)=temp;
end
end
if DCTrgb(i +4,i +1)<DCTrgb(i +3,i +2)
DCTrgb(i+4,i+1)=DCTrgb(i+4,i+1)-alpha;%将原本小的系数调整更小,使得系数差别变大
else
DCTrgb(i +3,i +2)=DCTrgb(i +3,i +2)-alpha;
end
end
%将信息写回并保存

wi=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T); %对DCTrgbl进行逆变换
output=io;
output(:,:,1)=wi;
imwrite(output,'watermarkedlena.bmp');

%figure;
%i = imread('lena.bmp');
%iw = imread('watermarkedlena.bmp');
%subplot(1,2,1);imshow(i);title('原始图像');
%subplot(1,2,2);imshow(iw);title('嵌入水印图像');

extract.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
clc;

wi=imread('watermarkedlena.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','a');
for i=1:128 %128为隐藏的秘密信息的比特数
if DCTcheck(i +4,i +1)<=DCTcheck(i +3,i +2)
fwrite(frr,1,'ubit1');
message(i,1)=1;
else
fwrite(frr,0,'ubit1');
message(i,1)=0;
end
end
fclose(frr);

本文章仅完成了DWT隐写算法

【实验步骤】

1、使用matlab计算原图与嵌入水印图像的峰值信噪比PSNR,得到结果为66.5859。

img

2、查找资料编写DWT代码,成功隐写并提取信息,计算PSNR为 68.5620

img

3、查找资料编写DFT代码,发现当修改DFT频域值后,图像频域由于共轭复数产生不对称,逆变换后仍为复数,无法逆变换为实际图像。

img

【实验代码】

myDWT.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
77
78
79
80
81
82
83
84
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;



[cA,cH,cV,cD]=dwt2(io,'haar');%使用haar小波



si=size(cH);



temp=0;

for i=1:count

if msg(i,1)==0

if cH(i+2)<cV(i+4)%使用cH(2),cV(4)系数进行隐藏

​ temp=cH(i+2);

​ cH(i+2)=cV(i+4);

​ cV(i+4)=temp;

end

else

if cH(i+2)>cV(i+4)

​ temp=cH(i+2);

​ cH(i+2)=cV(i+4);

​ cV(i+4)=temp;

end

end

if cH(i+2)<cV(i+4)

​ cH(i+2)=cH(i+2)-alpha;

else

​ cV(i+4)=cV(i+4)-alpha;

end

end



code1=idwt2(cA,cH,cV,cD,'haar');

output=code1;



imwrite(output,'DWTfig.bmp');

myDWTdecode.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
clc;



wi=imread('DWTfig.bmp');%读取携密图像

wi=double(wi)/255;

[cA,cH,cV,cD]=dwt2(wi,'haar');%使用haar小波

frr=fopen('ddd','a');

for i=1:136

if cH(i+2)<=cV(i+4)

​ fwrite(frr,1,'ubit1');

​ message(i,1)=1;

else

​ fwrite(frr,0,'ubit1');

​ message(i,1)=0;

end

end

fclose(frr);


频域图像水印
http://example.com/2022/12/31/频域图像水印/
作者
Magnesium
发布于
2022年12月31日
许可协议