基于量化的图像水印算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
张道德 UCAS
第2题 基于量化的图像水印算法
抖动调制是一种特殊的QIM 方法,但结构简单,其特点是给定量化器的任何量化
单元和重建点都是其他量化器量化单元和重建点的平移。在无水印的情况下 ,平移量
是随机的,成为抖动量。为了嵌入信息,抖动量可以待嵌入的水印信息进行调制。
将各个可能的带嵌入的的水印信息映射成不同的抖动量()d W 。载体信号在进行抖
动后,通过量化产生合成信号。在采用基本量化器()q ⋅的情况下,嵌入函数可以表示为
(;) (())()E X W q round X d W d W =+-
这类水印嵌入技术就称为抖动调制。
2.1 算法介绍
下面介绍采取均匀标量量化器的二进制抖动调制算法:
假设要嵌入的水印信息是一个二维序列,即{0,1}W =,其长度为L 。根据DM 的嵌
入函数,可以得到二值水印嵌入公式为
()(()[,])[,]k k S k q X k d k b d k b =+-
其中,()X k 是载体用来嵌入信息的的k 个数据,{0,1}k b ∈与水印W 相对应,[,]k d k b 是
抖动量,()q ⋅是基本量化器,即
()(/)q x round x ∆=∆⨯∆
这里,∆是量化步长,x 是待量化数据,()round ⋅表示四舍五入操作,()q ∆⋅表示量化步
长为∆的量化器。
• 确定要修改的载体数据()X k ,即从载体数据中根据一定原则选择合适的载体数
据来嵌入水印信息;
• 确定用于对各个载体数据()X k 进行量化的步长k ∆。如果各个载体数据的量化步
长不同,则是一种自适应量化;一般情况下,可以采用等步长的非适应量化,此
时k ∆相等,均为∆;
• 确定抖动量[,]k d k b ,一般[,0]d k 可任意选择,但是[,1]d k 要按下式进行选取:
[,1][,0]/2, [,1]0[,1][,0]/2, [,1]0k k d k d k if d k d k d k if d k =+∆<⎧⎨=-∆>⎩
在量化步长时,可以为每个载体数据选择相同的抖动量;
• 根据公式()(()[,])[,]k k S k q X k d k b d k b =+-,先用量化器函数()q ⋅对载体数据进行
量化,然后合成输出值()S k 。
在提取水印,一般采取最小距离检测,即
{0,1}()arg min |[]|k k Y l b k Y S l ∧
∈=- 其中,k Y 是检测器接收到的信号数据,[0]k Y S 和[1]k Y S 分别为假设k Y 是以[,0]d k 和[,1]
d k
为抖动量的情况下应该得到的抖动调制结果。
2.2编程实现与分析
我们在本实验嵌入的水印信息为一张大小为3232⨯的二值黑白图像。原始图像(载
体图像)为“elain1.bmp ”,其大小为512512⨯。我们将图像分块,分成88⨯的图像小块,
每块图像中嵌入1比特水印数据信息,易知可以讲水印信息完整嵌入。
2.2.1抖动调制的实验结果与分析
水印嵌入步骤如下:
• 确定要修改的载体数据。我们在本实验中选取两块图像小块的像素差值作为要修
改的载体数据,位置为[5][5]和[4][4],并将得到的信息保存在[4][4],即
[4][4][5][5](([5][5][4][4]))q d d ∆=--+-
其中d 为抖动量。
• 我们取量化步长∆是固定的,即20∆=,是一种非适应量化。
• 确定抖动量[,]k d k b 。我们在本实验中随机选择[,0][30,30]d k ∈-的整数, [,1]d k 按
下式进行选取:
[,1][,0]/2, [,1]0[,1][,0]/2, [,1]0k k d k d k if d k d k d k if d k =+∆<⎧⎨=-∆>⎩
并将[,0]d k 保存在一个一位数组中,传给水印提取者。
按照上述方法,将水印信息(二值黑白图像)嵌入到载体图像当中,如下图所示:
图2.1 原始图像与嵌入水印后的图像
两张图像用肉眼观察没有区别,可以得出水印信息的嵌入没有对原始图像在视觉上造成
水印提取采取最小距离检测从而提取水印。计算如下数值:
0011([5][5][4][4])(([5][5][4][4]))([5][5][4][4])(([5][5][4][4]))
x q d d
y q d d ∆∆=---+-⎧⎨=---+-⎩ 其中,0d 和1d 分别为当前嵌入信息为0和1的抖动量。从而得到当前嵌入的水印信息
0, 1, if x y b if x y
∧
<⎧=⎨<⎩ 提取水印结果很理想,与原始水印图像是一致的,结果如下图:
图2.2 原始水印图像与提取的水印图像 将水印图像中值滤波后,再次提取水印图像。对水印图像进行中值滤波后,与原始图像
有些区别,中值滤波后的图像更加清晰,如下图:
图2.3 原始图像与中值滤波后的水印图像 从中值滤波后的水印图像提取水印图像是很差的,几乎看不出原始水印图像的样子,如
下图:
图2.4 原始水印图像与中值滤波后提取的水印图像
2.2.2 程序代码
%************************************************************************************ ①求解水印图像的峰值信噪比和均方误差函数
function[MseValue,PsnrValue]=MsePsnr(OrigImg,Watermark)
%计算均方误差
%OrigImg为原始图像
%Watermark为嵌入水印信息后的图像
MseValue=0;
OrigImgMatrix=double(imread(OrigImg)); %读入更改后bmp位图,存入矩阵ImgMatrix中WatermarkMatrix=double(imread(Watermark));%读入更改后bmp位图,存入矩阵ImgMatrix中[r c]=size(OrigImgMatrix);
for i=1:r
for j=1:c
MseValue=MseValue+(OrigImgMatrix(i,j)-WatermarkMatrix(i,j))^2;
end
end
MseValue=MseValue/(r*c);
PsnrValue=10*log10(255^2/MseValue);
%************************************************************************************* ②水印嵌入函数,抖动嵌入函数
function[ArrayB,WMsize,ChangedMatrix]=QIM2(OrigImg,Watermark,step)
WaterMatrix=double(imread(Watermark)); %读入水印图像,存入矩阵WaterMatrix中BiMtrix=im2bw(WaterMatrix); % 将水印图像转化为二值图像
[Br,Bc]=size(BiMtrix);
ImgMatrix=double(imread(OrigImg)); %读入bmp位图,存入矩阵ImgMatrix中[r,c]=size(ImgMatrix);
ChangedMatrix=ImgMatrix; %更改后的图像数据
r8=floor(r/8);
c8=floor(c/8);
BlockCell=cell(r8,c8);
ArrayB=[]; %存储抖动量的数组
WMsize=[Br,Bc]; %存储水印图像的大小
% ********************************************************************************
%将图像进行分块,每块为8*8的子块
for i=1:r8
for j=1:c8
BlockCell{i,j}=ImgMatrix(((i-1)*8+1):(8*(i-1)+8),(8*(j-1)+1):(8*(j-1)+8));
end