Press "Enter" to skip to content

【图像隐写】基于matlab遗传算法的奇异值分解数字水印嵌入提取【含Matlab源码 2115期】

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

一、SVD数字水印简介

 

1 引 言

 

数字水印是随信息技术和计算机网络飞速发展而兴起的一种重要的版权保护手段, 它通过在数字载体 (图像、音频、视频、文本等) 中加入隐秘信息来达到这个目的, 在需要时这种隐秘信息可以通过特定方法检测出来, 以验证作品是否合法或受到篡改。目前, 数字水印已成为多媒体信息安全研究领域的一个热点, 也是信息隐藏技术研究领域的重要分支。

 

数字图像水印技术从实现过程上分空域算法和变换域算法。空域算法是指在图像的空间域中嵌入水印的方法, 通常具有较快的速度, 但一般鲁棒性较差;变换域算法是指在图像的变换域中嵌入水印的方法。变换域包括DCT域、DFT域、DWT域等, 由于图像的小波变换能够很好地匹配人类视觉系统 (HVS) 的特性, 还可以与JPEG2000标准相兼容, 因此小波域数字水印技术具有很好的应用前景。

 

本文针对二值水印图像, 结合奇异值分解与小波变换, 提出了基于奇异值分解的小波域水印算法。实验结果表明, 本文提供的方法具有较好的鲁棒性和不可见性。

 

2 小波变换与奇异值分解

 

作为一种数学工具, 小波变换是对人们熟知的傅里叶变换和窗口傅里叶变换的一个重大突破, 为信号分析、图像处理、量子物理及其他非线性科学的研究领域带来革命性的影响。小波变换具有许多良好的特性, 这些性质奠定了小波域水印技术的基础。小波分解的空间-频率特性与HVS某些视觉特性有相似性。该特性是小波变换区别于DFT和DCT的一个重要方面, 根据该特性可以将高强度的水印嵌入到HVS不太敏感的区域, 这样在保证不影响图像视觉质量的前提下, 可以最大限度地增加嵌入水印的强度。

 

小波变换可以将图像分解成低频子带和高频子带。其中, 低频带表示由小波变换分解级数决定的最大尺度、最小分辨率下对原始图像的最佳逼近, 图像的大部分能量集中在此。高频带则分别是图像在不同尺度、不同分辨率下的细节信息, 二维图像一级小波分解所得子图像按其重要性排序为LL1, HL1, LH1, HH1, 如图1所示。

 

奇异值分解是数值线性代数的有效算法之一, 它在统计分析、信号与图像处理、系统理论与控制中被广泛应用。在图像处理中应用的优势在于图像奇异值的稳定性非常好, 即当图像被施加小的扰动时, 图像的奇异值不会有大的变化, 并且奇异值所表现的是图像的内蕴特性而非视觉特性。

 

图1 二维静态图像的一级分解

 

设图像矩阵I为非负矩阵, I∈Rn×n, 其中R表示实数域, rank (I) =r (r≤n) , 则I的奇异值分解定义如下:

 

非零奇异值的个数等于矩阵的秩。

 

2 水印算法

 

为了保证嵌入水印后的图像质量和水印对信号处理的鲁棒性, 水印应嵌入到原始载体图像的中频部分。为了达到水印不可见性和鲁棒性的折衷, 应合理选取水印的嵌入强度因子α的值。

 

当原始载体图像为灰度图像时, 水印嵌入过程如下:

 

步骤一:将原始的二值水印图像取反, 再进行Arnold变换, 得到W˜, 并将迭代次数t作为密钥保存。

 

步骤二:将原始图像I进行一级小波分解, 得到中频子带HL1。

 

步骤三:将中频子带HL1进行SVD, 得到正交矩阵U, V及一个对角矩阵S。

 

步骤四:将水印W˜叠加到矩阵S上, 对新产生的矩阵S+αW˜进行奇异值分解, 得到U1, V1和S1。

 

步骤五:将矩阵U, S1和VT相乘, 得到处理后包含水印的图像D。

 

步骤六:用D代替步骤二中的HL1, 进行小波反变换, 得到潜入水印的图像I˜。

 

2.2 水印提取算法

 

水印提取算法恰好与水印的嵌入过程完全相反, 过程如下:

 

步骤一:将含水印图像I˜进行一级小波分解, 可得到中频子带HL¯¯1。

 

步骤二:对中频子带HL¯¯1进行SVD, 可得到正交矩阵U¯¯¯1, V¯¯¯1和对角矩阵S¯¯¯1。

 

步骤三:用S¯¯¯1代替水印嵌入算法步骤三中的对角矩阵S, 然后与正交矩阵U, V相乘, 即可得到矩阵图像D。

 

步骤四:利用水印嵌入算法步骤三、四中的S及α进行运算:W˜=1α(D−S), 则可得到置乱后的二值水印图像W˜。

 

步骤五:对W˜进行T-t次 (T表示Arnold变换的周期) Arnold变换并进行取反, 即可得到最终提取的二值水印图像。

 

二、部分源代码

 

close all;

 

clc;

 

%加载要加水印的原始图像

 

orig_img = imread(‘lena_256.bmp’);

 

orig_img = imresize(orig_img, [256,256]);

 

figure, imshow(orig_img); title (‘原始图片’)

 

[M,N] = size(orig_img);

 

nblock=M/8;

 

%加载要在原始图像中加水印的图像

 

wat_img = imread(‘njit_logo.jpg’);

 

wat_img = imresize(wat_img, [nblock,nblock]); % make it 32 X 32

 

wat_img=uint8(wat_img);

 

level = graythresh(wat_img);%找到一个很好的阈值

 

wat_img = im2bw(wat_img,level); %使水印变成二值图像

 

figure, imshow(wat_img); title(‘WaterMark Image’);

 

%现在调用遗传算法,最小值为10,最大值为20

 

% 值90与线性适应度函数

 

npop = input(‘No of Iteration (Population Size) = ‘); % 询问人口规模

 

% 最小值为10,最大值为90,是种群数目大小,适应函数是未知数的平方

 

[a,b,c] = genetic_algorithm (@(x)x^2,npop,npop,npop,npop,npop,npop,npop,1,150,250,.01);

 

% 攻击类型

 

fprintf(’ 1 – Midian Filter
’);

 

fprintf(’ 2 – Resize the image (scaling four times and then returned to original with bicubicinterpolation)
’);

 

fprintf(’ 2 – Salt and paper noise
’);

 

fprintf(’ 4 – Low pass filter
’);

 

fprintf(’ 5 – Image Jpeg Compression with Quality Factor 40
’);

 

attack_type = input(‘Attack Type: ‘);

 

max = 0.0; % 目标函数的最大值

 

peaksnr_value = 0; % 初始化 PEAKSNR 值

 

NC = 0; % 初始化归一化相关值

 

step=0;

 

final_image = zeros(M,N);

 

for i=2:npop

 

step_size = a(i);

 

Wimg = SVD_Watermarked(orig_img, wat_img, step_size);

 

% calculation of image quality degradiation after inserting watermark嵌入水印后图像质量退化的计算

 

[m,n] = size(orig_img);

 

error = orig_img – Wimg;

MSE = (sum(sum(error.^2)))/(m

n);

 

if (MSE > 0)

log10(255^2/MSE);

else

 

peaksnr=99;

 

end

 

% fprintf(‘The Peak Signal to noise ratio: %f db
’,peaksnr);

 

% 攻击水印图片

 

% 应用中值过滤器

if(attack_type

1)

 

attacked_Image = medfilt2(Wimg);

 

end

 

% 调整图像大小。 第一次缩放(四次)然后回到原来的

 

% 双三次插值

2)

attacked_Image = imresize(Wimg,4,‘nearest’);

 

attacked_Image = imresize(attacked_Image, [M N]);

 

end

 

%椒盐噪声

if(attack_type

3)

 

attacked_Image = imnoise(Wimg,‘salt & pepper’,0.002);

 

end

4)

attacked_Image = uint8(conv2(double(Wimg), double(ones(3,3))/9));

 

attacked_Image = imresize(attacked_Image, [M N]);

 

end

 

if(attack_type == 5)

 

imwrite(Wimg,‘Watermarked’,‘JPEG’,‘Quality’,40);

 

attacked_Image = imread(‘Watermarked.jpg’);

 

end

 

三、运行结果

 

 

四、matlab版本及参考文献

 

1 matlab版本

 

2014a

 

2 参考文献

 

[1]王选宏,肖云.基于奇异值分解的小波域水印算法[J].现代电子技术. 2010,33(05)

 

3 备注

 

简介此部分摘自互联网,仅供参考,若侵权,联系删除

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。