数字水印与版权保护


基础知识

脆弱水印

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

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

半脆弱水印

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

信息隐藏

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

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

关键词

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位$\alpha $通道数据

采样无损压缩

使用:

用于平面设计、网络传输

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)

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)

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)

fft2 - 二维快速傅里叶变换

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

    Y = fft2(X)
    Y = fft2(X,m,n)

(4)Y=ifft2(X)

ifft2 - 二维快速傅里叶逆变换

    此 MATLAB 函数 使用快速傅里叶变换算法返回矩阵的二维离散傅里叶逆变换。如果 Y 是一个多维数组,则 ifft2 计算大于 2
    的每个维度的二维逆变换。输出 X 的大小与 Y 相同。

    X = ifft2(Y)
    X = ifft2(Y,m,n)
    X = ifft2(___,symflag)

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

fftshift - 将零频分量移到频谱中心

    此 MATLAB 函数 通过将零频分量移动到数组中心,重新排列傅里叶变换 X。

    Y = fftshift(X)
    Y = fftshift(X,dim)

(6)Y=ifftshift(X)

ifftshift - 逆零频平移

    此 MATLAB 函数 将进行过零频平移的傅里叶变换 Y 重新排列回原始变换输出的样子。换言之,ifftshift 就是撤消 fftshift 的结果。

    X = ifftshift(Y)
    X = ifftshift(Y,dim)

实验1:

image=imread('input.jpg');
grayI=rgb2gray(image);
dft1=fft2(grayI);
adft1=abs(dft1);
top=max(adft1(:));
% 为了能更好观察频域数据,把范围做调整 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:

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的图像水印处理流程**?

程序:

% 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图像水印的基本流程**?

程序:

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)

输出:

原始水印信息
 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年

相关