数字水印与版权保护
基础知识
脆弱水印
水印加入载体后,提取不出来,即载体是无效的。
载体图像的任何修改都能被识别出
半脆弱水印
载体图像可以接受常规的修改,例如:格式转换、去燥等
信息隐藏
秘密信息是不可见的,且不影响载体的使用
加密后的密文是可见的,但看不懂
关键词
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,则可嵌入,
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年