数字水印与版权保护

基础知识#

脆弱水印#

水印加入载体后,提取不出来,即载体是无效的。

载体图像的任何修改都能被识别出

半脆弱水印#

载体图像可以接受常规的修改,例如:格式转换、去燥等

信息隐藏#

秘密信息是不可见的,且不影响载体的使用

加密后的密文是可见的,但看不懂

关键词#

Information Hiding (信息隐藏)

Steganography(隐写)

Steganalysis(隐写分析)

Digital Watermarking(数字水印)

时域|空域|频域#

1、空间域

也叫空域,即像素域,在空域的处理就是在像素级的处理,如在像素级的图像叠加,通过傅里叶变换后,得到的是图像的频谱,表示图像的能量梯度

2、频率域

任何一个波形都可以分解成多个正弦波之和,每个正弦波都有自己的频率和振幅,所以任何一个波形信号有自己的频率和振幅的集合,频率域就是空间域经过傅里叶变换的信号

3、时域

时间域,自变量是时间,即横轴是时间,纵轴是信号的变化,其动态信号 x(t) 是描述信号在不同时刻取值的函数

4、频域

频率域,自变量是频率,即横轴是频率,纵轴是该频率信号的振幅,也就是频谱图,描述了信号的频率结构及频率与该频率信号振幅的关系

傅里叶变换是实现空域或时域到频域的转换工具

傅里叶变换#

傅里叶指出:“任何周期函数都可以表示为用频率的正弦和、或余弦之和的形式【傅里叶级数】,每个正弦项和、或余弦项乘以不同的系数”

甚至非周期函数,也可以用频率的正弦和、或余弦乘以加权函数的积分来表示,这种情况叫做“傅里叶变换

具体参考:链接

数字水印#

主要用于版权保护

工作流程#

常用攻击#

1、裁减攻击

2、划线攻击

3、编码攻击

4、缩放攻击

5、旋转攻击

应用领域#

1、广播监控

2、版权保护

3、盗版追踪

4、内容认证

5、拷贝控制

信息隐藏#

两个主要分支:数字水印、隐写术

隐写术主要用于保密通信

常见的应用:

隐蔽信道#

隐蔽信道是相对于公开信道而言的,和公开信道一起使用,公开信道上传输的信息,是隐蔽信道上的载体

例:TCP协议头中保留字段可以用于携带秘密信息

伪装式保密通信#

将秘密信息隐藏在正常传输的信息中

目的:不引起注意

加密:容易引起注意

可视密码#

把要隐藏的秘钥信息通过算法隐藏到两个或多个子秘钥图片中

每张图片都有随机分布的黑点和白点

把所有的信息叠在一起,就能恢复出原有的信息

特点:回复秘密图像时不需要任何复杂的计算,直接观察就可分辨

举例:

1、基于像素扩展的秘密分享

(2*2分享)

2、基于图像分解的秘密分享

图像取证#

鉴定图像来源、图像完整性等

感知哈希#

由图像数据集到图像感知摘要集的一个简单地单项映射,是对图像感知信息的简短摘要

利用哈希的摘要性单向性抗碰撞性,对内容操作具有鲁棒性,对内容篡改有敏感性

用于图像内容的识别和认证

数字信封#

数字信封:将对称秘钥通过非对称加密(公钥和私钥)的结果分发对称秘钥的方法

数字信封包含:被加密的内容和被加密的用于加密该内容的秘钥,经常用接收方的公钥来加密秘钥

性能指标#

1、透明性

不可感知性,反映对原始信息的改变程度【PSNR值】

2、鲁棒性

抗攻击性,收到攻击后提取信息的正确率【BER、NC】

3、容量

嵌入1bit信息需要的载体信息bit【1bit 水印信息/nbit载体信息】

4、三者关系

容量增加,鲁棒性不变,透明性下降

容量减少,鲁棒性不变,透明性增加

容量不变,鲁棒性增加,透明性下降

容量不变,鲁棒性降低,透明性增加

隐写术#

隐写系统#

载体介绍#

1、存在冗余空间的载体

比如:图像,音频等,在冗余空间修改修改

2、没有冗余空间的载体

如文本等

3、载体特点

同一载体不应被使用两次,否则会重构秘密信息,破坏秘密信息

隐写系统分类#

1、无秘钥隐写系统

2、私钥隐写系统

是对称的

3、公钥隐写系统

是非对称的

公钥和私钥的结合1:

公钥和私钥的结合2:

遭遇第三方攻击时:

性能指标#

1、容量

负载,指载体数据利用率,嵌入效率

2、不可感知性

透明性 | 保真性:

3、健壮性

鲁棒性、健壮性

4、安全性

统计不可检测性

 

信号处理#

人能感知的声音频率为:16HZ~16KHZ

掩蔽效应#

强信号掩盖弱信号

模拟信号#

连续 

数字信号#

计算机能够表示,存储的信号

数字信号如何表示模拟信号?

1、抽样

单位时间内抽样点数够多

采样频率【HZ】:

奈奎斯特采样定律知:当采样频率满足一定要求时,数字信号能完整保留原始信号信息

2、量化

3、编码

对采样所得信息进行编码,产生码流单位 b/s 

音频文件格式#

1、WAV

例:

语音评价#

主观评价

平均意见分(MOS,Mean Option Score)

客观评价

比较波形差别:SNR值

例:计算SNR值

信号变换#

变换域操作:

1、DFT:离散傅里叶变换

2、DCT:离散余弦变换

3、DWT:离散小波变换

图像处理#

基础知识#

1、图像的表示

图像是由像素(pixel)组成,像素存储为矩阵

2、图像分辨率

指的是图像中像素的个数,例:1024*768,表示图像每行有1024个像素,每列有768个像素

3、图像类型

(1)灰度图像(8位)

图像每个像素大小为(0黑~255白)的灰度值(gray value)

每个像素用1个字节表示

(2)24位彩色图像

每个像素用三个字节表示,即像素颜色的红、蓝、绿分量

(3)索引图像

每个像素存储一个调色板索引值

调色板每条记录表示一个颜色(调色板中存储的值是归一化后的)

(4)二值图像

也叫黑白图像,像素值为0或者1,对应颜色为黑色和白色

4、图像文件格式

(1)文件头

包含图像的自我说明,即维数、类型、创建时间和标题等,也可以包含用于解释像素值的颜色表和编码表

(2)图像数据

像素颜色值或压缩后的数据

(3)常见的文件格式

(4)BMP位图文件

** 文件头

** 信息头

** 例

(5)JPEG

全称:Joint Photographic Experts Group ,联合图片专家组开发,用于彩色图像的存储和网络传输

特点:

采用有损压缩编码,数据量小

核心技术:DCT、量化、熵编码

要点:

用于保存表现自然景观的图像

用于网络传输

不适于表现有明显边界的图像

不适于高质量印刷文件

(6)GIF

全称:Graphics Interchange Format,CompuServe公司开发,用于屏幕显示和网络

特点:

具有87a、89a两种格式:87a描述单一静止图像;89a表示多帧图像

采用改进的LZW压缩算法

彩色模式:28  ,分辨率:96dpi

使用:

屏幕显示图片和电脑动画

用于网络传输

不适于保存高质量印刷文件

(7)TIFF

全称:Tag Image File Format,标记图像文件格式,Aldus公司开发,用于精准描述图像的场合

特点:

文件描述单一(静止)图像

彩色模式:21(单色)~232

支持多平台

采用多种压缩数据格式

(8)PNG

全称:Portable Network Graphic Format,便携式网络图形格式

特点:

支持索引、灰度、RGB三颜色以及Appha通道

灰度图像的深度最多16位,彩色深度最多48位,可存储最多16位α通道数据

采样无损压缩

使用:

用于平面设计、网络传输

5、图像质量评价

客观评价

(1)均方误差(MSE,Mean Square Error)

PS:M*N指像素点的个数

 (2)平均绝对误差(MAE,Mean Absolute Error)

 (3)峰值信噪比(PSNR,Peak Signal to Noise Ratio)

可以表示图像的平均修改程度,PSNR值越小,影响越大,一般大于30DB

缺点:评价结果有时与主观感觉不同

(4)例:计算PSNR

图像变换#

1、DFT:离散傅里叶变换

 更多参考:链接

二维傅里叶公式:

Matlab函数:

(1)Y=fft(X)

1
2
3
4
5
6
7
8
9
fft - 快速傅里叶变换
 
    此 MATLAB 函数 用快速傅里叶变换 (fft) 算法计算 X 的离散傅里叶变换 (DFT)。 如果 X 是向量,则 fft(X) 返回该向量的傅里叶变换。
    如果 X 是矩阵,则 fft(X) 将 X 的各列视为向量,并返回每列的傅里叶变换。 如果 X 是一个多维数组,则 fft(X) 将沿大小不等于 1
    的第一个数组维度的值视为向量,并返回每个向量的傅里叶变换。
 
    Y = fft(X)
    Y = fft(X,n)
    Y = fft(X,n,dim)

(2)Y=ifft(X)

1
2
3
4
5
6
7
8
9
10
ifft - 快速傅里叶逆变换
 
    此 MATLAB 函数 使用快速傅里叶变换算法计算 Y 的逆离散傅里叶变换。X 与 Y 的大小相同。 如果 Y 是向量,则 ifft(Y) 返回该向量的逆变换。
    如果 Y 是矩阵,则 ifft(Y) 返回该矩阵每一列的逆变换。 如果 Y 是多维数组,则 ifft(Y) 将大小不等于 1
    的第一个维度上的值视为向量,并返回每个向量的逆变换。
 
    X = ifft(Y)
    X = ifft(Y,n)
    X = ifft(Y,n,dim)
    X = ifft(___,symflag)

(3)Y=fft2(X)

1
2
3
4
5
6
7
fft2 - 二维快速傅里叶变换
 
    此 MATLAB 函数 使用快速傅里叶变换算法返回矩阵的二维傅里叶变换,这等同于计算 fft(fft(X).').'。如果 X 是一个多维数组,fft2
    将采用高于 2 的每个维度的二维变换。输出 Y 的大小与 X 相同。
 
    Y = fft2(X)
    Y = fft2(X,m,n)

(4)Y=ifft2(X)

1
2
3
4
5
6
7
8
ifft2 - 二维快速傅里叶逆变换
 
    此 MATLAB 函数 使用快速傅里叶变换算法返回矩阵的二维离散傅里叶逆变换。如果 Y 是一个多维数组,则 ifft2 计算大于 2
    的每个维度的二维逆变换。输出 X 的大小与 Y 相同。
 
    X = ifft2(Y)
    X = ifft2(Y,m,n)
    X = ifft2(___,symflag)

(5)Y=fftshift(X):转换后,低频处在四个角上,用此函数将其归为中心

1
2
3
4
5
6
fftshift - 将零频分量移到频谱中心
 
    此 MATLAB 函数 通过将零频分量移动到数组中心,重新排列傅里叶变换 X。
 
    Y = fftshift(X)
    Y = fftshift(X,dim)

(6)Y=ifftshift(X)

1
2
3
4
5
6
ifftshift - 逆零频平移
 
    此 MATLAB 函数 将进行过零频平移的傅里叶变换 Y 重新排列回原始变换输出的样子。换言之,ifftshift 就是撤消 fftshift 的结果。
 
    X = ifftshift(Y)
    X = ifftshift(Y,dim)

实验1:

1
2
3
4
5
6
7
8
9
10
11
12
image=imread('input.jpg');
grayI=rgb2gray(image);
dft1=fft2(grayI);
adft1=abs(dft1);
top=max(adft1(:));<br>% 为了能更好观察频域数据,把范围做调整
bottom=min(adft1(:));
adft1=(adft1-bottom)/(top-bottom)*100;
adft2=fftshift(adft1);
figure;
subplot(131),imshow(image),title('原图');
subplot(132),imshow(adft1),title('原频谱图');
subplot(133),imshow(adft2),title('移位频谱图');%将低频移到中间

常见的图形进行傅里叶变换,可以大致反映出图形的特征:

DFT的性质:

平移图像后,频谱基本一样:

旋转图像,频谱也对应旋转:

低通和高通:

低通:将距离中心较远的信息直接去掉,“类似加一个块“

低通的参数越大,图像越模糊

将四周的信息全部去掉,图像会模糊的更自然点:

高通:将中间的一部分信息去掉,“类似这样:”

高通的参数越大,图像亮度越低:

2、DCT:离散余弦变换

更多参考:链接

二维余弦变换:

对图片进行DCT变换,能量主要集中在左上角低频分量处:

Matlab函数:
1、Y=dct(X)

2、Y=idct(X)

3、Y=dct2(X)

4、Y=idct2(X)

实验1:

1
2
3
4
5
6
7
8
9
10
image=imread('input.jpg');
grayI=rgb2gray(image);
dct1=dct2(grayI);
adct1=abs(dct1);
top=max(adct1(:));
bottom=min(adct1(:));
adct1=(adct1-bottom)/(top-bottom)*100;
figure;
subplot(131),imshow(image),title('原图');
subplot(132),imshow(adct1),title('DCT频谱图');

应用:

DCT常用于图像信号处理,例:JPEG图像压缩

图像不同位置的DCT系数大小,反映图像不同频率成分的强弱,位置与频率有反应关系,水平方向从左到右,频率逐渐升高;垂直方向从上到下,频率逐渐升高

实验2:DCT系数特性研究

总结:DCT系数中高频分量对图像影响不大

3、DWT:离散小波变换

更多:参考

小波变换分块:

图像转换#

PS:

彩色图像 ——》索引图像 :会失真

索引图像 ——》彩色图像:无失真

常用函数:

例子:

BW=im2bw(I,T):图像转换成二值图像

参数:

  I:图像数据

  T:归一化的分割阈值(0-1)

  BW:分割后的二值图像

如何寻找阈值呢?

方法:双峰法

适用于:图像中前景和背景差别明显,且各占一定比例

效果:

作业#

第五次作业#

问题1:

使用文件格式信息隐藏,在一幅256×256的灰度图像中隐藏512字节秘密数据,描述隐藏实现过程,必须将哪些图像格式参数修改,修改为什么?

解:

将秘密信息隐藏在文件数据尾部

需要修改文件头中文件长度域,即文件头中的 bfSize +512 即可

问题2:

在一幅3×3图像数据中,每个像素4bit,使用MLSB算法实现14bit秘密信息的隐藏,描述隐藏方法?

解:

什么是MLSB?

除最低比特平面外,图像其他低平面也可以隐藏信息,替换多个图像比特平面隐藏信息的算法,叫做MLSB

问题3:

使用基于颜色索引顺序的信息隐藏,如果有6个颜色值,问最多可以隐藏几bit的秘密信息?

解:

设图像可嵌入M比特秘密信息,有N种颜色,则要满足下面的关系

 故若有6种颜色,即N=6,则可嵌入,比特秘密信息,即M ≤9,故最多可以隐藏9bit秘密信息

第六次作业#

1.使用基于颜色索引顺序的信息隐藏,针对PPT128-132的例子,当秘密信息d=0101时,试用文字描述如何确定4个颜色的排序为(C2,C1,C0,C3)?

解:

2.使用基于调色板图像内容的信息隐藏,针对PPT137页的例子,其他条件不变,如果秘密信息为111000,问LSB隐藏后的像素值(颜色索引值)?

解:

第七次作业#

1、参考第4章第1个PPT第182页,尝试描述仙农信道容量公式的含义?如果高斯信道的带宽为8kHz,信号和噪声功率比为7,求该信道的信道容量?如果要在该信道上传输30kb/s的信号,是否能实现无差错传输?

2、参考第4章第2个PPT第7页:DCT频域信息隐藏框架,尝试用文字**描述基于DCT的图像水印处理流程**?

程序:

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
85
% DCT 变换信息隐藏
io = imread("huidu.jpg");
figure;
subplot(1,3,1),imshow(io),title("原图");
 
io = double(io);
% 待嵌入的秘密信息msg
msg = [1,0,1,1];
% 用于计数,嵌入完成后停止操作。
count = length(msg);
org_msg = [1,0,1,1];
T = dctmtx(8); %图像分块8*8
DCTrgb = blkproc(io,[8 8], 'P1*x*P2',T, T'); % 对载体图像进行DCT变换
subplot(1,3,2),imshow(DCTrgb),title("DCT分块变换");
 
[row,col]=size(DCTrgb);
row=floor(row/8);
col=floor(col/8);
alpha=0.02;
k = 1;
temp=0;
for i=0:(row - 1)
    for j=0: (col -1)
        irow = i * 8;
        jcol = j * 8;
        if k <= count
            if msg(k) == 0
                %选择(5,2),(4,3)这两对系数,
                % 策略是(5,2)的DCT系数 < (4,3)时,表示嵌入了0 
                % 如果(5,2) > (4,3) 那我们把两个系数交换,还表示嵌入了0
                if DCTrgb(irow + 5, jcol + 2) < DCTrgb(irow + 4,jcol + 3)
                    temp = DCTrgb(irow + 5, jcol + 2);
                    DCTrgb(irow + 5, jcol + 2) = DCTrgb(irow + 4,jcol + 3);
                    DCTrgb(irow + 4, jcol + 3) = temp;
                end
            else
                if DCTrgb(irow + 5, jcol + 2) > DCTrgb(irow + 4,jcol + 3)
                    temp = DCTrgb(irow + 5, jcol + 2);
                    DCTrgb(irow + 5, jcol + 2) = DCTrgb(irow + 4,jcol + 3);
                    DCTrgb(irow + 4, jcol + 3) = temp;
                end
            end
            %将原本小的系数变的更小,使系数差变大
            if DCTrgb(irow + 5, jcol + 2) < DCTrgb(irow + 4,jcol +3)
                DCTrgb(irow + 5, jcol + 2) = DCTrgb(irow +5, jcol +2) - alpha;
            else
                DCTrgb(irow + 4, jcol + 3) = DCTrgb(irow + 4, jcol +3) - alpha;
            end
            k = k + 1;
        end
    end
end
wi=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T); %嵌入信息的载体DCT变换,恢复图像
orgin_wi=wi/255;
subplot(1,3,3),imshow(orgin_wi),title("嵌入信息后的");
 
% 提取消息
% ext_msg是提取出的秘密信息
ext_msg = [];
T=dctmtx(8);
DCTcheck=blkproc(wi,[8 8],'P1*x*P2',T,T'); %对隐秘图像进行DCT变换
[row,col]=size(DCTcheck);
row=floor(row/8);
col=floor(col/8);
k = 1;
for i=0:(row - 1)
    for j=0: (col -1)
        irow = i * 8;
        jcol = j * 8;
        %通过比较(5,2),(4,3)这两对系数,判断隐藏的信息是1还是0
        if k <= count
            if DCTcheck(irow + 5, jcol + 2) < DCTcheck(irow + 4,jcol + 3)
                ext_msg(k,1)=1;
            end
            if DCTcheck(irow + 5, jcol + 2) > DCTcheck(irow + 4,jcol + 3)
                ext_msg(k,1)=0;
            end
            k = k + 1;
        end
    end
end
fprintf("嵌入的信息:");
disp(msg);
fprintf("提取的信息:");
disp(ext_msg);

3、参考第4章第2个PPT第56页:DFT频域信息隐藏框架,尝试用文字**描述DFT图像水印的基本流程**?

程序:

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
function p =watermark()
%使用DCT方法,实现图片水印嵌入
chars_info = char('shaohang110');
fprintf('原始水印信息\n %s \n', chars_info);
len=uint8(chars_info);
bits_info = reshape(de2bi(len,8,'left-msb')',[],1);
yuanImg=imread('Lena2.bmp');
k=50000;  %DFT用的系数
 
wmImg=[];
yuanImgYUV=[];
%彩色图像水印嵌入
yuanImgYUV = rgb2ycbcr(yuanImg);
%观察原始图像幅度频率特性
%fftAM=uint8(abs(fftshift(fft2(yuanImgYUV(:,:,1))))/100);
%imshow(fftAM)
yuanImgYUV(:,:,1) = EmbedWM_289(yuanImgYUV(:,:,1), bits_info, k,1);
wmImg = ycbcr2rgb(yuanImgYUV);
%观察嵌入水印后图像幅度频率特性
%fftAM=uint8(abs(fftshift(fft2(yuanImgYUV(:,:,1))))/100);
%figure(2);imshow(fftAM)
imwrite(wmImg,'wm.bmp');
figure;
subplot(1,2,1),imshow(yuanImg),title("原图");
subplot(1,2,2),imshow(wmImg),title("嵌入水印后");
 
fprintf("水印提取:");
extraWM(len);
 
 
%%水印嵌入
function fw = EmbedWM_289(f, bits_info, k, type)
%本程序用来对图像进行DFT,通过改变DFT的分块系数的能量关系,实现水印的嵌入
%f:当前需要嵌入的图像
%bits_info:嵌入的水印内容
%k:嵌入水印的强度
%type:表示嵌入的类型,
%type=1时:(e1 - e) > k,表示水印0; (e2 - e1) > k,表示水印1
%type=2时:(e1 - e2) > k,表示水印1; (e2 - e1) > k,表示水印0
stepx = 4;%每bit嵌入区域的横向步长
stepy = 4;%每bit嵌入区域的纵向步长
 
 %k = 50000;
 
len_info = length(bits_info);%嵌入信息的长度
 
fftHuge = fftshift( fft2(f) );
 
if ( mod(size(fftHuge, 1), 2) == 0 )
    if ( mod(size(fftHuge, 2), 2) == 0 )
        fftHuge_ct = fftHuge(2:end, 2:end);
    else
        fftHuge_ct = fftHuge(2:end, :);
    end
else
    if ( mod(size(fftHuge, 2), 2) == 0 )
        fftHuge_ct = fftHuge(:, 2:end);
    else
        fftHuge_ct = fftHuge(:, :);
    end
end
 
dist_r = floor( size(fftHuge_ct, 1)/4 );
dist_c = floor( size(fftHuge_ct, 2)/4 );
 
fftHuge_wm = fftHuge_ct(dist_r+1: end-dist_r, dist_c+1: end-dist_c);
 
rmax_block = floor(size(fftHuge_wm,1)/(2*stepy));%纵向(行)最大分块数,由于中心对称性,故只处理上半部分
cmax_block = floor(size(fftHuge_wm,2)/stepx);%横向(列)最大分块数
 
if( rmax_block * cmax_block < len_info )
    disp('水印信息过长\n');
    return;
end
 
SG1 = zeros(stepy*stepx/4, 2);
SG2 = zeros(stepy*stepx/4, 2);
 
% modified coefficients
% 右上角的系数
count = 1;
for r = 1 : stepy/2
    for c = stepx/2+1 : stepx
        SG1(count, 1) = r;
        SG1(count, 2) = c;
        count = count + 1;
    end
end
 
% 左下角的系数
count = 1;
for r = stepy/2+1 : stepy
    for c = 1 : stepx/2
        SG2(count, 1) = r;
        SG2(count, 2) = c;
        count = count + 1;
    end
end
 
count = 1;
for r = 1 : rmax_block
    for c = 1 : cmax_block
        fft_block = fftHuge_wm( (r-1)*stepy+1 : r*stepy, (c-1)*stepx+1 : c*stepx );
        %---------------------------系数修改--------------------------------
        % 计算能量及幅角
        ext = abs(fft_block); %幅度
        theta = angle(fft_block); %相角
         
        e1 = 0;
        e2 = 0;
        for i = 1 : size(SG1,1)
            e1 = e1 + ext(SG1(i,1), SG1(i,2));
            e2 = e2 + ext(SG2(i,1), SG2(i,2));
        end
         
        % 修改能量
        if(type==1)   %类型1
            if ( bits_info(count) == 0 && (e1 - e2) < k )
                delta = (k - e1 + e2)/(2*size(SG1,1));%每个系数的修改量,size(SG1,1)表示每个区域的点数
                for i = 1 : size(SG1,1)
                    ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) + delta;
                    ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) - delta;
                end
            elseif ( bits_info(count) == 1 && (e2 - e1) < k)
                delta = (k - e2 + e1)/(2*size(SG1,1));%每个系数的修改量,size(SG1,1)表示每个区域的点数
                for i = 1 : size(SG1,1)
                    ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) + delta;
                    ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) - delta;
                end
            end
        elseif(type==2)
            if ( bits_info(count) == 1 && (e1 - e2) < k )
                delta = (k - e1 + e2)/(2*size(SG1,1));%每个系数的修改量,size(SG1,1)表示每个区域的点数
                for i = 1 : size(SG1,1)
                    ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) + delta;
                    ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) - delta;
                end
            elseif ( bits_info(count) == 0 && (e2 - e1) < k)
                delta = (k - e2 + e1)/(2*size(SG1,1));%每个系数的修改量,size(SG1,1)表示每个区域的点数
                for i = 1 : size(SG1,1)
                    ext(SG2(i,1), SG2(i,2)) = ext(SG2(i,1), SG2(i,2)) + delta;
                    ext(SG1(i,1), SG1(i,2)) = ext(SG1(i,1), SG1(i,2)) - delta;
                end
            end
        end
        % 恢复FFT系数矩阵
        re = ext.*cos(theta);
        im = ext.*sin(theta);
        fft_block = re + 1i*im;
        %------------------------------------------------------------------
        fftHuge_wm( (r-1)*stepy+1 : r*stepy, (c-1)*stepx+1 : c*stepx ) = fft_block;%将修改后的FFT系数置回
        fftHuge_wm( end-r*stepy+1 : end-(r-1)*stepy, end-c*stepx+1 : end-(c-1)*stepx ) = rot90( conj(fft_block), 2 );%将修改后的共轭FFT系数转置后置回
         
        if ( count >= len_info )
            break;
        end
             
        count = count + 1;
    end
     
    if ( count >= len_info )
        break;
    end
end
 
fftHuge_ct(dist_r+1: end-dist_r, dist_c+1: end-dist_c) = fftHuge_wm;
 
if ( mod(size(fftHuge, 1), 2) == 0 )
    if ( mod(size(fftHuge, 2), 2) == 0 )
        fftHuge(2:end, 2:end) = fftHuge_ct;
    else
        fftHuge(2:end, :) = fftHuge_ct;
    end
else
    if ( mod(size(fftHuge, 2), 2) == 0 )
        fftHuge(:, 2:end) = fftHuge_ct;
    else
        fftHuge(:, :) = fftHuge_ct;
    end
end
 
fw = uint8( ifft2(ifftshift(fftHuge)) );
 
mse=mymse(f,fw,size(f,2),size(f,1));
psnr=10*log10(255^2/mse);
fprintf('PSNR = %f\n', psnr);
 
%%水印提取
function p =extraWM(len)
%使用DCT方法,实现图片水印提取
%提取水印时不需要原始水印内容,但是需要水印的长度
 
bits_info = reshape(de2bi(len,8,'left-msb')',[],1);
 
%下面进行水印提取
wmImg=imread('wm.bmp');
%wmImg=imread('wm.jpg');
%wmImg=imread('wm2.bmp');
%彩色图像提取水印
wmImgYUV=[];
wmImgYUV = rgb2ycbcr(wmImg);
bits_info_ext = ExtractWM_289(wmImgYUV(:,:,1), length(bits_info),1);     
%二进制数组转换为字符串
extrastr='';
[m n]=size(bits_info_ext);
for x=1:m/8
    temp=bi2de(bits_info_ext((x-1)*8+1:x*8)','left-msb');
    extrastr=[extrastr char(temp)];
end
extrastr
ber(bits_info_ext, bits_info)

输出:

1
2
3
4
5
6
7
原始水印信息
 shaohang110
PSNR = 48.607484
水印提取:
extrastr =
 
    'shaohang110'

第8次课作业#

1、参考第4章第3个PPT第33页,描述针对几何失真下采用频域模板实现鲁棒水印的方法?

解:

鲁棒水印:能够抵抗各种信号处理,攻击

几何失真:只要由扫描过程引起的旋转和缩放失真

方法:提取图像边缘,并利用RADON投影变换来检测图像的倾斜角,完成后,逆向旋转图像即可

RADON投影变换:将原始图像变换为它在各个角度的投影表示。

2、采用抗打印扫描水印算法(二)基于DCT分块系数比较的方法(参考第4章第3个PPT第78页),已知4块内数据为:(1.2, 1.6, 1.7),(1.7,1.8,1.6),(1.8,2.0,2.1),根据该算法策略,嵌入水印0,1,0后,数据修改为什么?(D=0.5)

解:

3.采用抗打印扫描水印算法(三)基于系数分类的方法(参考第4章第3个PPT第92页),已知4个集合分别为:

F(3,0)={ +1.0, -1.4,-0.9,-1.2},

F(2,1)={ +2.2, -1.8,+0.5,-1.0},

F(1,2)={ -1.5,+1.1,+0.3,-0.8},

F(0,3)={ +1.2, -1.3,+0.4,-1.0},

若鲁棒性参数d为2,嵌入0时,要求𝑛+≥𝑛−+𝑑;嵌入1时,要求𝑛−≥𝑛++𝑑。则嵌入0,0,1,1后,系数调整为什么?

解:

第九次作业#

1、半脆弱水印如何建立图像块中LSB与图像块内容的联系?(提示:参考PPT中P. W. Wong水印算法),该算法能否抵抗图像拼凑攻击?如何抵抗图像拼凑攻击?

解:

2. 尝试描述音频回声隐藏水印提取的过程?注意不要抄公式!【设原信号为x(t), 增加回声后信号为y(t),隐藏0时,延时为Δ1,隐藏1时,延时为Δ2】

解:

3.回声隐藏信号生成:

已知音频片段采样值为以下序列:

: 8, 10, 12, 14, 8, 8, 12,14,12,10,14,16, 14,18,16,12,10,12

衰减系数为0.5,’0’回声延迟为2个采样点,’1’回声延迟为1个采样点,每6个样点为一个片段。已知秘密信息为(1,1,0)B,且隐藏后信号为:

写出混合器信号 , (不用考虑过渡)

写出携带秘密信息的信号

解:

第十次作业#

1、语音信号的抽样频率是多少?G.711中每个抽样值编码位数是多少?尝试描述参数编码的实现思路?

解:

语音信号的抽样频率8k/s

G.711中每个抽样值编码位数是 8位

参数编码的实现过程:先进过计算,找到当前的5个抽样值组成的码组和哪个码本最接近,然后用这个码本的编号取代原来的40bit码组,1024个码本对应的编码是10bit,故经过参数后,用10bit码本编号作为参数,进行通信。

补充:

G.711:又叫PCM(脉冲编码调制),是国际电信联盟订定出来的一套语音压缩标准,主要用于电话,它主要用脉冲编码调制对音频采样,采样率为8k每秒。它利用一个 64Kbps 未压缩通道传输语音讯号。起压缩率为1:2,即把16位数据压缩成8位。G.711是主流的波形声音编解码器

G.711 标准下主要有两种压缩算法。一种是µ-law algorithm (又称often u-law, ulaw, mu-law),主要运用于北美和日本;另一种是A-law algorithm,主要运用于欧洲和世界其他地区。其中,后者是特别设计用来方便计算机处理的。这两种算法都使用一个采样率为8kHz的输入来创建64Kbps的数字输出。G.711采用一种称为分组丢失隐藏(PLC)的技术来减少丢包带来的实际影响。有效的信号带宽在静默期间通过语音活动检测(VAD)这一过程被减小。

压缩编码分为:波形编码、参数编码和混合编码

波形编码:对于采样得到的每个数据进行压缩编码

参数编码:提取语音信号的特征参数进行编码,传输的是这些参数,不是语言信号本身

2、在静态软件水印中,如何设计实现中间代码软件水印?攻击者如何检测中间代码软件水印?

解:

         实现中间代码软件水印分为两部分:

首先嵌入水印:程序设计不会执行“死流程”,用合法的语句填充死流程,然后编码源代码,用水印替换死流程对应的中间代码

然后提取水印:找到死流程对应位置,提取水印

         攻击者可以进行如下攻击:

                  方法一:列举出所有函数的执行时间,定位从未执行的函数

                  方法二:在不影响软件功能的情况下调整指令的顺序

                  方法三:水印不会执行指令,根据软件执行多次执行的时间分布信息,可以很有效的猜测出水印的隐藏位置

补充:

软件水印:把程序的版权信息和用户身份嵌入到程序中

静态水印:存储在可执行程序代码中

静态代码水印:静态数据水印

静态代码水印嵌入位置:中间代码、源代码

3、采用基于大数分解难题的软件水印方案,已知水印数字为16,基底为3,如何用基数图表示这个水印?(按据根节点的距离,由近到远依次编号为:2,1,0,要求说明每个节点左指针指向几号节点)

解:

 

4、在像素翻转信息隐藏中(参照PPT第86页)已知一行6个文字,黑色像素的像素个数分别是14,17,12,14,16,17,嵌入策略定为:嵌入0,则把比值调整为0.8;嵌入1,则把比值调整为1.2;一半汉字用于嵌水印,一半用于平衡,使嵌入前后均值不变;那么嵌入1,1,0三个比特后,这行汉字的黑色像素变为(均衡像素的分配尽量平均)?

解:

 

参考#

1、信息隐藏与数字水印.杨榆,雷敏.北京邮电大学出版社有限公司,2017年

2、信息隐藏与数字水印实验教程.杨榆.国防工业出版社,2010年

作者:Hang Shao

出处:https://www.cnblogs.com/pam-sh/p/14473711.html

版权:本作品采用「知识共享」许可协议进行许可。

声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.

posted @   PamShao  阅读(2115)  评论(2编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-03-10 数据结构:链表
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu