当前位置: 首页 > news >正文

【图像隐写】基于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 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

相关文章:

  • 计算机视觉中的细节问题(二)
  • Javascript 代码规范
  • linux驱动开发(2)开发流程
  • 【云原生】设备云之前端可视化编程
  • 计算电磁学(二)分析方法
  • 【Django】开发日报_3.2_Day:模板继承
  • 探索原味BFF模式
  • unity初学 Mstudio教程
  • Complete Partition Of Array
  • 单节点k8s—自签名证书—四层负载均衡—helm安装rancher
  • 高频面试题:谈谈你对 Spring Boot 自动装配机制的理解
  • Apple Xcode 14 (14A309) 正式版发布(含下载)
  • mysql 执行计划 type详解
  • Java进阶篇之泛型
  • 发送post请求渲染el-table,并实现搜索和分页功能
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • [译]如何构建服务器端web组件,为何要构建?
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • JS字符串转数字方法总结
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Node项目之评分系统(二)- 数据库设计
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Redux 中间件分析
  • SAP云平台里Global Account和Sub Account的关系
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Vue.js-Day01
  • 闭包--闭包之tab栏切换(四)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 回顾2016
  • 力扣(LeetCode)965
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 为什么要用IPython/Jupyter?
  • 新手搭建网站的主要流程
  • 异常机制详解
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #07【面试问题整理】嵌入式软件工程师
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (solr系列:一)使用tomcat部署solr服务
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)甲方乙方——赵民谈找工作
  • .FileZilla的使用和主动模式被动模式介绍
  • .gitignore文件_Git:.gitignore
  • .sh 的运行
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [DNS网络] 网页无法打开、显示不全、加载卡顿缓慢 | 解决方案
  • [DP 训练] Longest Run on a Snowboard, UVa 10285