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

【MATLAB图像处理实用案例详解(8)】—— 图像数字水印算法

目录

    • 一、背景意义
    • 二、基本原理
    • 三、算法介绍
      • 3.1 数字水印嵌入
      • 3.2 数字水印提取
    • 四、程序实现

一、背景意义

数字水印技术作为信息隐藏技术的一个重要分支,是将信息(水印)隐藏于数字图像、视频、音频及文本文档等数字媒体中,从而实现隐秘传输、存储、标注、身份识别、版权保护和防篡改等目的。
随着 1996 年第一届信息隐藏国际学术研讨会的召开,数字水印技术的研究得到了迅速的发展,不少政府机构和研究部门加大了对其的研究力度,其中包括美国财政部、美国版权工作组、美国洛斯阿莫斯国家实验室、美国海陆空军研究实验室、欧洲电信联盟、德国国家信息技木研究中心、日本 NTT 信息与通信系研究中心、麻省理工学院、南加利福尼亚大学、普渡大学、剑桥大学、瑞士洛柔联邦工学院、微软公司、CA 公司等研究机构。另外,在 TEEE 和 SPIE 等一些重要国际会议上,也专门开辟了与数字水印相关的专题。欧洲几项较大的工程项目(如 VIVA 和ACTS)中也均有关于图像水印方面的专题研究。我国在这一领域的研究也基本与欧美等科技强国保持同步,目前国内已经有不少科研机构投人到数字水印方面的研究中去。1999年底,第一届全国信息隐藏学术研讨会(CIHW)在北京电子技术应用研究所召开。国家“863 计划”“973项目”(国家重点基础研究发展规划)、国家自然科学基金等也都对图像水印的研究有项目资金支持。
在这里插入图片描述

二、基本原理

图像数字水印技术以一定的算法将一些标志性信息嵌人到图像中,而不影响原图像的面质和使用。水印信息可以是序列号或有特殊意义的文本等,通过和载体图像的紧密结合而达到识别图像来源、作者等版权信息的目的。与传统加密技术不同,图像水印技术的目的并不在于直接阻止对图像的盗版,而是着眼于如何将版权信息加入到正版图像,并能够从盗版图像中提取出先期加人的版权方面的证据(水印),在能够证明图像确系盜版之后再以法律的手段对盜版者实施制裁。
图像数字水印处理可分为对水印的嵌人处理和对已嵌人的水印的检测处理两部分。从图像处理的角度看,嵌人水印可以看作是在强背景(原始图像)下叠加一个弱信号(水印),由于人的视觉系统对图像的分辨率有限,因此只要叠加的信号在幅度上低于某个对比度门限,就可以使人眼完全感受不到叠加信号的存在,这个对比度门限主要受系统的空间、时间和频率特征的影响。因此,在不改变视觉效果的前提下,对原始图像做一定的调整,嵌入一些额外信息是完全有可能的。

由于图像数字水印的目的不在于限制其正常的图像复制,而在于保证隐藏其內的水印不被侵犯和发现。因此,在向图像嵌人水印时。必领考虑到正常的信息操作对水印所造成的威胁,以及要求水印能够对通常的图像编辑操作具有一定的抵御、免疫能力。根据图像水印的目的和技术要求,可以总结出图像水印的一些特点。
①鲁棒性 (robustness):图像一旦嵌人了水印后,图像与水印将紧密地融合在一起,而且不因因像的某种处理而导致隐含的水印信息丢失。这里所谓的“处理”,包括了噪声干扰、滤波、平滑、增强、重采样、有损编码压缩、D/A 或 A/D转换等各种常规的图像处理手段。图像水印除了能对无意识的图像处理操作具有抵御能力外,还应具各抵扰恶意删除攻击、逃惑攻击等有意识政击的能力,除非攻击方对加人的水印有足够的先验知识,否则任何破坏和去除水印的企图都将严重损坏因像的面质,使破解后的图像毫无利用价值。
②不可检测性(undetectability):水印和图像应具有一致的特性,如统计噪声分布等,这样可以使非法攻击者无从确认该图像是否含有水印信息。
③透明性 (invisibility):此特性主要应用了人眼的生理特点,经过隐藏处理的图像水印不会对原始图像有视觉可察的画质降低现象。
④低复杂性:水印的嵌人和提取识别算法应简单易行。
⑤自恢复性:嵌入了水印的图像在经过一系列的处理和变换后,可能对原图产生了较大的破坏,这就要求从留下的片段中仍可提取出水印(或水印残片),并根据检验出的结果确认出水印的存在。

三、算法介绍

3.1 数字水印嵌入

以一副512X512大小的lena灰度图像和64X64大小的水印灰度图像为例说明水印嵌入的具体步骤
第一步,对512X512的原始图像I系数矩阵分成8X8大小的块,则原图一共被分成64X64块。对每个块进行二维离散余弦变换(DCT)。
第二步,原图就变成了64X64个8X8大小的系数矩阵,正好64X64大小的水印图像J中矩阵的每个系数对应于原始图像的每个块,水印的嵌人利用公式:F’ (u,v)=F(u,v)+aw(i) ,其中F(u,v)为原始图像的DCT系数,a为嵌入强度,w(i)(i=1,2,3,…)是每点的水印像素。
第三步,对这64X64块嵌入水印信息的矩阵做二维DCT逆变换,再合并成一个整图,就得到了嵌入水印后的图像。
代码如下:

%读入原始图像和水印图像并显示
I=imread('lena512.jpg');
figure(1);
subplot(2,2,1);
imshow(I);
title('原始图像');
J=imread('xiaohui64.jpg');
subplot(2,2,2);
imshow(J);
title('水印图像');
%对水印图像进行arnold置乱预处理
H=double(J);
tempImg=H; %图像矩阵赋给tempImg
for n=1:5  %置乱次数
for u=1:64
for v=1:64
temp=tempImg(u,v);
ax=mod((u-1)+(v-1),64)+1;%新像素行位置
ay=mod((u-1)+2*(v-1),64)+1;%新像素列位置
outImg(ax,ay)=temp;
end
end
tempImg=outImg;
end
G=uint8(outImg);%得到置乱后的水印图像
%嵌入水印
for p=1:64
for q=1:64 %p、q都是1到64,是因为有64*64个8*8的块,每次循环处理一个块
BLOCK1=I(((p-1)*8+1):p*8,((q-1)*8+1):q*8);%每个8*8的块
BLOCK1=dct2(BLOCK1);%做2维的DCT变换
BLOCK1(4,5)=BLOCK1(4,5)+0.2*G(p,q);%在每块DCT系数的4行5列处嵌入水印,系数可调
W(((p-1)*8+1):p*8,((q-1)*8+1):q*8)=idct2(BLOCK1);%做DCT反变换
end
end
%显示嵌入水印后的图像
imwrite(uint8(W), 'lena_mark.jpg ', 'jpg');
subplot(2,2,3);
imshow('lena_mark.jpg');
title('嵌入水印后的图像');

在这里插入图片描述
上图中0.2为可调参数嵌入强度系数,可以发现,随着嵌入强度的增大,嵌入水印后的图像效果越来越差。

3.2 数字水印提取

水印的提取是根据水印的嵌入策略执行相应的逆过程来提取水印。因此,在水印提取过程中,只须将嵌人水印后的图像块经DCT变换后的系数减去相应强度的水印信息就可以提取出嵌人该块的水印信息,再对所有块提取出来的水印信息进行反置乱就得到提取出来的水印图像。
水印提取的具体步骤如下:
第一步,读入嵌入水印后的图像W和原始水印图像I。
第二步,分别对W和I进行分块DCT变换,得到每个块的系数矩阵。
第三步,对每个8X8块的中频系数位置上,利用公式 w ( i ) = F ′ ( u , v ) − F ( u , v ) a w(i) = \frac{F^{'}(u,v)-F(u,v)}{a} w(i)=aF(u,v)F(u,v)计算出每一块的水印信息,合并成一个整图,就得到了提取出来的水印图像。
代码如下:

for p=1:64
for q=1:64
BLOCK1=W(((p-1)*8+1):p*8,((q-1)*8+1):q*8);
BLOCK2=I(((p-1)*8+1):p*8,((q-1)*8+1):q*8);
BLOCK1=dct2(BLOCK1);
BLOCK2=dct2(BLOCK2);
Y(p,q)=(BLOCK1(4,5)-BLOCK2(4,5))/0.2;
end
end
% 对水印进行arnold反置乱
for n=1:43 % 循环次数为48-5
for u=1:64
for v=1:64
temp1=Y(u,v);
bx=mod((u-1)+(v-1),64)+1;
by=mod((u-1)+2*(v-1),64)+1;
outImg1(bx,by)=temp1;
end
end
Y=outImg1;
end
%显示提取出来的水印图像
imwrite(uint8(Y), 'watermark.jpg ', 'jpg');
subplot(2,2,4);
imshow('watermark.jpg');
title('提取出来的水印图像');

四、程序实现

程序运行结果如下:
在这里插入图片描述


ok,以上便是全部内容了,如果对你有所帮助,记得点个赞哟~

相关文章:

【MATLAB图像处理实用案例详解(8)】—— 图像数字水印算法

目录 一、背景意义二、基本原理三、算法介绍3.1 数字水印嵌入3.2 数字水印提取 四、程序实现 一、背景意义 数字水印技术作为信息隐藏技术的一个重要分支,是将信息(水印)隐藏于数字图像、视频、音频及文本文档等数字媒体中,从而实现隐秘传输、存储、标注…...

最全的免费SSL证书申请方式

在SSL广泛普及的今天,申请一张免费的SSL证书是一件非常容易的事情。这里为大家总结当前阶段(2023年)拥有一张免费SSL证书的方式。首推的方式为来此加密网站,文章后面会有详细的介绍。 下面介绍几种获取免费SSL证书的方式,大家可以根据自己的…...

Ceph入门到精通-CrushMap算法概述

下面是伪代码object到osd的伪代码 locator =object_name obj_hash =hash(locator) pg =obj_hash %num_pg OSDs_for_pg =crush(pg) # returns a list of OSDs primary =osds_for_pg[0] replicas =osds_for_pg[1:] defcrush(pg): all_osds=[osd.0,osd.1,osd.2,...] resu…...

如何利用API做好电商,接口如何凋用关键字

一.随着互联网的快速发展,电子商务成为了众多企业的首选模式,而开放API则成为了电商业务中不可或缺的部分。API(Application Programming Interface),即应用程序接口,是软件系统不同组件之间交互的约定。电…...

Give me a logic game idea about economics

Here’s an logic game idea about economics: Game name: “Economics Tycoon” Game Objective: Build an economic empire and grow from a small business owner to a global tycoon. Gameplay: Start with a small business and limited resources. Manage your compa…...

测试之路,2023年软件测试市场领域有哪些变化?突破走得更远...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…...

配置Windows终端直接执行Python脚本,无需输入“python“

配置Windows终端直接执行Python脚本,无需输入"python" 1. 将Python加入环境变量2. 将Python后缀加入环境变量PATHEXT中3. 修改Python脚本的默认打开方式4. *将Python脚本命令加入环境变量*5. 测试 在Linux系统中,在Python脚本的开头指定Python…...

IDEA快捷键

文章目录 快捷键介绍重点掌握CtrlAltShiftCtrl AltCtrl ShiftAlt ShiftCtrl Shift Alt其他 快捷键介绍 重点掌握 psvmmain函数sout输出soutv带变量名输出.sout变量.调用 输出变量值.if布尔值.调用 生成if语句.for数组类型变量.for 生成for语句.var补全接收的变量&#x…...

关于c++指针数组的要设置初值的情况

在大多数情况下,都应该对指针数组进行初始化,以避免出现未知的值和潜在的未定义行为。指针数组在定义时必须指定元素个数,如果未指定元素值,则需要对其进行显式初始化。如果未初始化数组,则未知的值可能指向无效的内存…...

泰克RSA306B频谱分析仪测试信道功率方法

泰克RSA306B实时频谱分析仪是一种用于无线信号分析的仪器。它可以实时监控无线信号的频谱,帮助用户分析信号特征,掌握信号的功率、频率、调制等关键信息。在无线通信中,信道功率是一个非常重要的指标,它反映了信号在传输过程中的强…...

深度学习技巧应用12-神经网络训练中批归一化的应用

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用12-神经网络训练中批归一化的应用,在深度学习中,批归一化(Batch Normalization,简称BN)是一种重要的技巧,它在许多神经网络中都得到了广泛应用。本文将详细介绍批归一化的原理和应用,并结合PyTorch框架构建一个简…...

Masonry使用以及源码解析(未完待续

文章目录 Masonry使用约束约束优先级 以及 intrinsicContentSize相关问题 Masonry:iOS12Masonry源码解析下面是使用make.width点语法后的全部内部调用过程: Masonry使用 约束 在写Masonry之前,我想先来聊聊约束的基础知识,我们首先要了解一…...

118-Linux_数据库_索引

文章目录 一.索引是什么?二.索引为什么选择b树三.测试索引1.在mysql中创建数据库 test_indexdb2.在test_indexdb中创建表 test_index3.运行程序向表中插入1万条数据,都是字符串4. 查询验证 一.索引是什么? 索引是一种特殊的文件,它包含着对数据表里所…...

macos和windows区别 macos怎么运行windows程序

在我们使用电脑时,重要的是电脑内应用,而系统不过是运行软件的“容器”。日常生活中,我们常见的操作系统是macos和windows,那么macos和windows区别在哪?这两款操作系统的区别很大。macos怎么运行windows程序&#xff1…...

一起Talk Android吧(第五百四十二回:无进度值ProgressBar)

文章目录 概念介绍使用资源文件实现使用默认设置修改风格使用动画资源 使用代码实现经验总结 各位看官们大家好,上一回中咱们说的例子是"ProgressBar总结",本章回中介绍的例子是" 无进度值ProgressBar"。闲话休提,言归正转&#xf…...

Oracle DataGuard奇怪的ORA-16494错误

Oracle数据库DataGuard数据无法同步,主库查询v$archive_dest出现ORA-16494错误。 数据库版本Oracle 12.1.0.2.0: SQL> select * from v$version;BANNER --------------------------------------------------------------------------------CON_ID --…...

《花雕学AI》Poe 一站式 AI 工具箱:ChatGPT4 体验邀请,亲,不要错过哦!

你有没有想过,如果你能在同一个平台上体验多种不同的 AI 模型,和他们进行有趣、有用、有深度的对话,甚至还能轻松地分享你的对话给其他人,那该有多好?如果你有这样的想法,那么你一定不能错过 Poe 一站式 AI…...

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘

terminal运行报错AttributeError: module lib has no attribute X509_V_FLAG_CB_ISSUER_CHECK 解决: pip install pyOpenSSL --upgrade...

Origin如何绘制基础图形?

文章目录 0.引言1.绘图操作2.图形设置3.图形标注 0.引言 因科研等多场景需要绘制专业的图表,笔者对Origin进行了学习,本文通过《Origin 2022科学绘图与数据》及其配套素材结合网上相关资料进行学习笔记总结,本文对绘制基础图形进行阐述。 1.…...

OpenGL(九)——颜色

目录 一、前言 二、简单光源 三、光照场景 3.1 创建光源 3.2 光源顶点着色器 3.3 光源片段着色器 3.4 物体片段着色器 3.5 光源位置 一、前言 我们看到的物体颜色是通过光照在物体,然后反射到人眼成像,具体而言是物体不能吸收的颜色。如白光照射…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...