图像隐写基于matlab图像内容自恢复水印含Matlab源码 2321期
Posted 海神之光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像隐写基于matlab图像内容自恢复水印含Matlab源码 2321期相关的知识,希望对你有一定的参考价值。
⛄一、图像内容自恢复水印
1 引 言
数字水印技术能有效对网络传输中的多媒体信息进行认证。根据对多媒体信息篡改检测的敏感性不同,用于认证的数字水印可分为脆弱性和半脆弱性两类[1],脆弱性水印主要用于完全级认证[2,3,4,5],半脆弱性水印则主要用于内容级认证。利用它们能较好地验证信息的真实性,检测并定位篡改区域[5,6]。但是在大多数情况下,对于被篡改的多媒体信息仅仅进行检测和定位篡改不能满足要求。人们更希望能对篡改进行恢复,自动弥补被破坏的地方,恢复原始的图像内容。要实现图像的这种自恢复功能,则要求作为水印的数据必须同原始图像的内容联系起来,利用隐藏在图像中的水印数据才可能对被破坏的图像恢复出原貌。
本文提出了基于嵌入式小波编码的图像自恢复脆弱水印算法,它利用零树结构对自身图像进行压缩编码[7,8],得到嵌入的恢复水印数据,并大大减少嵌入水印的数据量。而对水印的编码块进行置乱后再嵌入水印数据,有利于增强恢复功能。水印嵌入到图像灰度位平面编码的后两位,使嵌入水印图像达到了良好的视觉效果。算法对篡改图像的恶意操作具有很强的识别和自恢复能力,该算法是真正的盲检测。
1 算法描述
1.1 自嵌入算法
由于要使图像达到被非法篡改后,还能通过嵌入其中的水印恢复出被篡改区域原来真的内容,因此要求原始图像必需参与进行水印的制作,保留住原始数据。而灰度图像的数据量比较大,不能直接作为水印嵌入到自身,所以利用SPIHT压缩算法对灰度图像进行压缩,以减少水印的嵌入量。算法步骤如下:
(1)将M×N大小的原始图像I的灰度值系数进行位平面分解,然后把最后两个bit位平面值置为0,得到位平面矩阵;
(2)在把分解的各个平面矩阵按公式合成得到新的图像I’;
(3)对图像I’分成m×n的子块,每一个子块都进行小波变换,将比特率控制在BR=1bpp进行SPIHT压缩编码,则每一子块SPIHT编码后的数据量应该在m×nbit左右。最后按子块组成的SPIHT编码矩阵按密钥k进行块置乱;
(4)将置乱后的分块编码矩阵对应地嵌入到图像I’的第二位bit位中,第二位不够,嵌入到对应块的第一位,就得到了嵌入自相关的水印的图像。
整个嵌入流程如图1所示。
图1 水印嵌入过程
该算法将制作的自相关水印数据嵌入到后两个比特位,图像质量会有一些下降,但是修改了最后两位比特位,对每一个像素点而言最多使灰度值增加或减少3,因此灰度值的改变量很小,不足以引起视觉上的明显变化。另外要注意,在进行SPIHT编码时,把特率控制在BR=1bpp,所以系数长度不会超过2×m×n个,在m×n左右。因为在嵌入时,所有的系数值只能嵌入到图像位平面编两个位平面上。另外,得到的分块编码嵌入时,原始像素后两位中未有数据嵌入的置为0。
1.2 提取水印及自恢复算法
(1)将含水印图像的灰度值系数进行位平面编码,提取最后两个bit位的值,即得到水印编码置乱矩阵,再进行反置乱得到提取的SPIHT二值矩阵A;
(2)将水印图像灰度值后两个bit位置0后,再分成m×n的子块,对每一分块的特率控制在BR=1bpp进行SPIHT压缩编码,得到二值矩阵A’;
(3)A与A’都是二值矩阵,将A矩阵与A’矩阵对应分块的系数进行比较,设置一个阈值T,若两子块里所有对应系数的差值的绝对值小于T,则可以认为该块数据是真实的;若该块里有系数的差值大于T,则判定该系数位是出错位,而该出错位对应的嵌水印图像对应的m×n小块都标记为出错位;
(4)在二值矩阵A找到出错小块的SPIHT编码数据,进行SPIHT解码重构,再用重构的图像代替出错位,就可以恢复出被篡改区域的原始图像内容。
整个过程如图2所示:
图2 水印提取及恢复过程
图像自恢复算法的关键部分有2点,一是定位被篡改区域;二是自恢复功能。在认证过程中不需要其他的水印信息进行比较来确定被篡改区域。该自嵌入算法和自恢复算法思想能巧妙地实现对篡改像素的精确定位,使恢复出的水印图像能表示原始图像的概貌,从而较好地纠正被篡改的图像区域。另外,水印嵌入时对编码矩阵进行置乱处理非常关键,它不仅可以起到对嵌入数据加密的作用,而且其置乱程度直接影响到提取出的水印效果及图像自恢复的程度。
⛄二、部分源代码
%----------- Input ----------------
[Orig_I,map] = imread(‘1.bmp’);
Orig_I=double(Orig_I);
rate = 1;
%----------- Pre-processing ----------------
OrigSize = size(Orig_I, 1);
max_bits = floor(rate * OrigSize^2)
OutSize = OrigSize;
image_spiht = zeros(size(Orig_I));
% "image " is the input of codec
[nRow, nColumn] = size(Orig_I);
%----------- Wavelet Decomposition ----------------
n = size(Orig_I,1);
n_log = log2(n);
level = n_log;
% wavelet decomposition level can be defined by users manually.
type = ‘bior4.4’;
[Lo_D,Hi_D,Lo_R,Hi_R] = wfilters(type);
[I_W, S] = func_DWT(Orig_I, level, Lo_D, Hi_D);
%----------- Coding ----------------
img_enc = func_SPIHT_Enc(I_W, max_bits, nRow*nColumn, level);
whos(‘img_enc’)
%----------- Decoding ----------------
img_dec = func_SPIHT_Dec(img_enc);
%----------- Wavelet Reconstruction ----------------
img_spiht = func_InvDWT(img_dec, S, Lo_R, Hi_R, level);
imwrite(uint8(img_spiht),‘img_spihtlena.bmp’);
%----------- PSNR analysis ----------------
Q = 255;
MSE = sum((img_spiht - Orig_I) .^ 2) / nRow / nColumn;
MSE =sum(MSE);
psnr = 10log10(QQ/MSE)
⛄三、运行结果
⛄四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]何登平,范鹏.一种基于图像内容的自恢复水印算法[J].四川理工学院学报(自然科学版). 2008(04)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
以上是关于图像隐写基于matlab图像内容自恢复水印含Matlab源码 2321期的主要内容,如果未能解决你的问题,请参考以下文章
图像隐写基于matlab分层自嵌入数字水印内容认证与恢复含Matlab源码 1641期
图像隐写基于matlab GUI变换域的可逆数字水印系统设计含Matlab源码 1813期
图像隐写基于matlab FFT数字水印嵌入含Matlab源码 1670期
图像隐写基于matlab DWT+IDWT数字水印嵌入+提取含Matlab源码 1530期