matlab编程实现一种简单的数字水印嵌入与提取方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab编程实现一种简单的数字水印嵌入与提取方法相关的知识,希望对你有一定的参考价值。

方法用LSB或者DCT法,图片跟水印图片名字就1.bmp跟2.bmp吧,

DCT    嵌入水印图片与DWT是擦不多的。在Matlab上直接用函数的话值是一样的,应该说DWT包含DCT。下面我说一下嵌入过程,程序就不写了。网上很多的。给你一个嵌入思路。

DWT方法。原图大小为(512,512)嵌入图片大小为(64,64)

嵌入:

    读取原图片。

    读取水印图片。

    原图片要处理为灰图。

    水印图片要处理为2值图。

    生成伪随机乱数(记住是怎么生成的,提取时用到)。

    随机乱数做成2值图K与水印图生成密钥WK的2值图(方法有很多种)。

    原图片做3次DWT处理(Matlab里函数是dwt2)得到图片DA,DB,DC,DD。

    取出DB或DC,或者DB,DC都用上,设一个嵌入强度Q,与密钥K一起嵌入到DB,DC中(方法有很多种)。

    将嵌入后的DB,DC与没有嵌入的DA,DD一起(DA,DB,DC,DD顺序不要错了)进行反DWT处理。

    得到嵌入水印后的图片进行保存。

提取:

    读取嵌入水印后的图片。

    嵌入水印后的图片做3次DWT,并得到DA,DB,DC,DD。

    定义Q(嵌入时的强度,比如5)。

    生成嵌入水印时的伪随机乱数并做成2值图K。

    取出,嵌入水印的成分(嵌入到DB的话取出DB,两个都用了就两个都取出,在这里用DB代替)。

    进行嵌入时的反计算。

    提取后的水印图片进行保存。

参考技术A %%%%%%%%%%% 嵌入水印算法 %%%%%%%%%%%%%%
clear all;
clc;
%%%%%% 读取水印图象 %%%%%%%
I=imread('123.bmp');
omark=double(imread('123.bmp'))/255; % 把图像数据类型转换为双精度浮点类型%
mo=32;
no=32;
%%%%% 以下生成水印信息 %%%%%%
mark=omark;
alpha=200;
R1=randn(1,8); %产生标准正态分布的1*8矩阵
rand1=round(R1); %对R1进行四舍五入
R2=randn(1,8);
rand2=round(R2);
%%%%%%% 读取宿主图像 %%%%%%%
cimage=imread('lena.bmp');
figure(1);
subplot(2,3,1),imshow(cimage,[]),title('原始的宿主图像');
[mc,nc]=size(cimage);
cimage=double(cimage);
fun = @(block_struct)fft2(block_struct.data);
fft0=blockproc(cimage,[8,8],fun); % 对宿主图像进行分块的FFT运算。

图像隐写基于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 水印算法
2.1 水印嵌入算法

为了保证嵌入水印后的图像质量和水印对信号处理的鲁棒性, 水印应嵌入到原始载体图像的中频部分。为了达到水印不可见性和鲁棒性的折衷, 应合理选取水印的嵌入强度因子α的值。
当原始载体图像为灰度图像时, 水印嵌入过程如下:
步骤一:将原始的二值水印图像取反, 再进行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\\n’);
fprintf(’ 2 - Resize the image (scaling four times and then returned to original with bicubicinterpolation)\\n’);
fprintf(’ 2 - Salt and paper noise\\n’);
fprintf(’ 4 - Low pass filter\\n’);
fprintf(’ 5 - Image Jpeg Compression with Quality Factor 40\\n’);
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)))/(mn);
if (MSE > 0)
peaksnr = 10
log10(255^2/MSE);
else
peaksnr=99;
end
% fprintf(‘The Peak Signal to noise ratio: %f db\\n’,peaksnr);
% 攻击水印图片
% 应用中值过滤器
if(attack_type1)
attacked_Image = medfilt2(Wimg);
end
% 调整图像大小。 第一次缩放(四次)然后回到原来的
% 双三次插值
if(attack_type
2)
attacked_Image = imresize(Wimg,4,‘nearest’);
attacked_Image = imresize(attacked_Image, [M N]);
end
%椒盐噪声
if(attack_type3)
attacked_Image = imnoise(Wimg,‘salt & pepper’,0.002);
end
if(attack_type
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 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

以上是关于matlab编程实现一种简单的数字水印嵌入与提取方法的主要内容,如果未能解决你的问题,请参考以下文章

图像隐写基于matlab GBT+SVD数字水印嵌入与提取含Matlab源码 1668期

图像隐写基于matlab DWT数字水印嵌入+攻击+提取含Matlab源码 1759期

语音隐写基于matlab GUI LSB语音信号数字水印嵌入提取(带面板)含Matlab源码 1676期

求matlab 嵌入提取可见水印的程序

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

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