[Python图像处理] 基于离散余弦变换的安全扩频数字水印

news2025/1/19 2:30:08

基于离散余弦变换的安全扩频数字水印

    • 数字水印
    • 基于离散余弦变换的安全扩频数字水印
    • 实现安全扩频数字水印
    • 相关链接

数字水印

数字水印是可见的或不可见的标识码,这种标识码被永久嵌入图像中,并且即使在解码过后后仍存在于图像中。为了保证有效性,水印应具有以下特征:

  • 水印应在视觉上不可见,或者其存在至少不会干扰受保护的对象
  • 水印必须难以去除,当然我们希望其不可能被去除。如果只有部分水印相关信息,例如,图像中水印的确切位置未知,那么尝试去除或破坏水印应导致图像质量严重下降

基于离散余弦变换的安全扩频数字水印

在本节中,我们将采用基于离散余弦变换 (Discrete Cosine Transform, DCT) 的水印技术,将水印构造为一个独立同分布的高斯随机向量,该向量以类似扩频的方式隐秘的插入到数据感知上最重要的频谱分量中。
在该机制下的水印插入使水印对信号处理操作(例如有损压缩、滤波、以及常见的几何变换裁剪、缩放、平移和旋转等)具有鲁棒性。当然,前提是原始图像可用,并且可以成功地与变换后的带水印图像进行配准。将随机水印矢量 X 插入图像向量 V 中以获得带水印图片,算法描述如下:
插入水印:

v i ′ = v i ( 1 + α x i ) v'_i=v_i(1+\alpha x_i) vi=vi(1+αxi)

提取水印:

x i ′ = ( v i ′ v i − 1 ) α x'_i=\frac {(\frac {v'_i} {v_i} -1)} {\alpha} xi=α(vivi1)

评估水印间的相似性:

s i m ( X , X ∗ ) = X ∗ ⋅ X x ∗ ⋅ X ∼ N ( 0 , 1 ) sim(X,X^*)=\frac {X^*\cdot X} {\sqrt {x^* \cdot X}}\sim N(0,1) sim(X,X)=xX XXN(0,1)

从测试图像中提取可能的水印后,我们需要计算其与实际水印的相似性,如果相似性很高,我们可以安全地得出测试图像中存在水印的结论。

实现安全扩频数字水印

(1) 首先导入所需 Python 库:

from scipy.fftpack import dct, idct
from skimage.io import imread
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

(2) 使用 scipy.fftpack 实现 2D DCTIDCT

def dct2(a):
    return dct(dct(a.T, norm='ortho').T, norm='ortho')

def idct2(a):
    return idct(idct(a.T, norm='ortho').T, norm='ortho')   

(3) 实现函数 embed() 以在输入图像上嵌入长度为 k (通过参数 k 指定)的随机水印,缩放参数 a 指示水印的对图像的变化程度。函数将水印嵌入到具有最高值的DCT系数中,返回嵌入水印并生成随机水印的索引和系数,以及输出(水印)图像:

def embed(im, k, alpha):
    m, n = im.shape
    d = dct2(im)
    indices = np.dstack(np.unravel_index(np.argsort(d.ravel()), (m, n)))[0]
    indices = indices[-(k+1):-1]
    cw = d[indices[:,0], indices[:,1]]
    w = np.random.randn(k)
    #w = w / np.linalg.norm(w)
    ci = cw * (1 + alpha * w)
    d[indices[:,0], indices[:,1]] = ci
    im1 = idct2(d)
    return im1, indices, cw, w

(4) 实现函数 detect() 以检测图像中是否存在水印。首先,从测试图像中提取可能的水印,然后计算/返回相似度:

def detect(test, indices, cw, w, alpha):
    d = dct2(test)
    testc = d[indices[:,0], indices[:,1]]
    what = (testc/cw - 1) / alpha
    gamma = what@w/(np.linalg.norm(what)) #*np.linalg.norm(w))
    return gamma

(5) 最后,使用该函数将长度 1000 的水印嵌入灰度输入图像中,然后计算图像水印是否存在:

k = 1000
alpha = 0.1
im = rgb2gray(imread('3.png'))
im = (255*im).astype(np.uint8)
im1, indices, cw, w = embed(im, k=k, alpha=alpha)
print('mean difference={}, max difference={}'.format(np.mean(np.abs(im1-im)), np.max(np.abs(im1-im))))
similarity = detect(im1, indices, cw, w, alpha)
print('detected similarity={}'.format(similarity))

从以上结果可以看出,相似性为 31.89,因此,我们可以得出结论,图像中包含水印。

(6) 绘制原始图像、带有水印的图像和两个图像间的差异:

fig = plt.figure(figsize=(20,10))
plt.gray()
plt.subplots_adjust(0,0,1,0.925,0.05,0.05)
plt.subplot(131), plt.imshow(im), plt.axis('off'), plt.title('original image {}'.format(im.shape), size=10)
plt.subplot(132), plt.imshow(im1), plt.axis('off'), plt.title(r'watermarked image: $v_i^{\prime}=v_i.(1+\alpha x_i)$', size=10)
plt.subplot(133)
last_axes = plt.gca()
img = plt.imshow((np.abs(im1-im)).astype(np.uint8))
divider = make_axes_locatable(img.axes)
cax = divider.append_axes("right", size="5%", pad=0.05)
fig.colorbar(img, cax=cax)
plt.sca(last_axes)
plt.axis('off'), plt.title('difference image', size=10)
plt.show()

数字水印

相关链接

Python图像处理【1】图像与视频处理基础
Python图像处理【2】探索Python图像处理库
Python图像处理【3】Python图像处理库应用
Python图像处理【4】图像线性变换
Python图像处理【5】图像扭曲/逆扭曲
Python图像处理【6】通过哈希查找重复和类似的图像
Python图像处理【7】采样、卷积与离散傅里叶变换
Python图像处理【8】使用低通滤波器模糊图像
Python图像处理【9】使用高通滤波器执行边缘检测
Python图像处理【10】基于离散余弦变换的图像压缩
Python图像处理【11】利用反卷积执行图像去模糊
Python图像处理【12】基于小波变换执行图像去噪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jetpack Compose 中在屏幕间共享数据的 5 种方案

1. 路由传参 Jetpack Compose 中路由传参的方式有很多种,具体可以参考 Jetpack Compose 中的导航路由 以下是最简单的路由传参测试代码: import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.…

Java开发框架:Spring介绍

Spring 概述特点Spring 程序遇到的问题与解决 概述 Spring 是 Java EE 编程领域中的一个轻量级开源框架,由 Rod Johnson 在 2002 年最早提出并随后创建,目的是解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。其中,轻量…

代理模式的运用

文章目录 一、代理模式的运用1.1 介绍1.2 结构1.3 静态代理1.3.1 火车站买票案例类图1.3.2 代码 1.4 JDK动态代理1.4.1 代码1.4.2 JDK动态代理的执行流程 1.5 CGLIB动态代理1.5.1 导包1.5.2 代码 1.6 三种代理的对比1.7 优缺点1.8 使用场景 一、代理模式的运用 1.1 介绍 由于…

从0开始搭建Hyperledger Fabric2.x环境(fabric2.5版本)

Hyperledger Fabric 2.5环境搭建 一.Linux环境准备 # root登录 yum -y install git curl docker docker-compose tree yum -y install autoconf autotools-dev automake m4 perl yum -y install libtool autoreconf -ivf # 安装jq相关包 cd /opt git clone --recursive https…

软考A计划-系统架构师-官方考试指定教程-(8/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

Redis从入门到精通【进阶篇】之数据类型Stream详解和使用示例

文章目录 0.前言1. 基本概念1.1. Stream的结构1.2. 持久化1.3. Stream的消费者组 2.实现原理2.1. Stream的数据结构2.2. Stream的消息追加2.3. Stream的消费2.4. Stream的消费者组 3.Redis Stream底层原理3.1. 基数树(Radix Tree)3.2. listpacks小结 4.命…

数据清洗、数据处理入门!R语言我来了,数据不再零散!

一、引言 数据清洗和预处理是数据科学中必不可少的一部分,它们能够帮助我们准确地分析和预测未来趋势。如果你曾经尝试过进行分析或建模,你会发现数据往往不像我们所想象的那样干净、整洁。需要对数据进行仔细的检查、清理和处理,才能真正把…

JavaSE笔记(五)重制版

泛型程序设计 在前面我们学习了最重要的类和对象,了解了面向对象编程的思想,注意,非常重要,面向对象是必须要深入理解和掌握的内容,不能草草结束。在本章节,我们还会继续深入了解,从泛型开始&a…

delphi D11编程语言手册 学习笔记(P344-392) 接口/类操作

P344-365 接口 "接口" 的概念和 "类" 特别是 "抽象类" 近似, Delphi 之初并没有接口, 后来(Delphi 3)为了支持 COM 引入了接口, 再后来发展成为 Delphi 重要的语言特性. 使用 COM 步骤可能是这样的:     1.程序在使用组件之初, 先联系 "…

Java-API简析_java.util.ArrayList类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131119289 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

2023最新ChatGPT商业版4.8.8支持GPT4.0+AI绘画midjourney+实时语音识别输入+后台一键版本更新!

2023最新ChatGPT商业版4.8.8支持GPT4.0AI绘画midjourney永久更新! 1.网站系统源码介绍: 程序已支持ChatGPT4.0、Midjourney绘画、GPT3.5 API绘画、语音识别输入、用户会员套餐用户每日签到功能后台管理一键更新版本。支持手机电脑不同布局页面自适应。…

【MySQL 数据库】6、一篇文章学习【索引知识】,提高大数据量的查询效率【文末送书】

目录 一、索引概述二、索引结构(1) 不同类型的索引结构(2) 二叉树和红黑树(3) B 树(4) B树(5) Hash(6) 为什么InnoDB存储引擎选择使用Btree索引结构相对于二叉树,层级更少,搜索效率高; 三、索引的分类(1) 聚集索引和二级索引(2) 思考题 四、索…

STM32之FreeRTOS

目录 FreeRTOS 介绍 什么是 FreeRTOS ? 为什么选择 FreeRTOS ? FreeRTOS 资料与源码下载 祼机开发与 FreeRTOS 祼机开发: FreeRTOS: FreeRTOS 实现多任务的原理 二、移植 FreeRTOS 手动移植 使用CubeMX快速移植 快速移植流程…

基于Hadoop与Electron的京东商品评论词云统计系统

一、综合设计目的与要求 合肥工业大学软件工程专业《云计算、大数据技术与应用》课程综合设计报告。 爬取京东或淘宝某一商品的评论1000条,统计词频(使用MapReduce或HBase或Hive),并以词云的方式可视化呈现,最后设计为…

python-面向对象:三大特性高级特性

文章目录 前言一、面向对象三大特性:封装、继承、多态1.对象和类2.封装3.继承(1)重写父类方法(2)多继承(3)私有属性与私有方法 4.多态 二、三大特性的应用1.链表的封装2.栈的封装3.队列的封装4.二叉树的封装 三、高级特性1.类属性与实例属性2.类方法与静态方法3.pro…

三相PWM整流器滞环电流控制MATLAB仿真模型

三相PWM整流器滞环电流控制MATLAB仿真模型资源-CSDN文库https://download.csdn.net/download/weixin_56691527/87882090 模型简介: 该模型采用滞环电流控制方法来控制PWM整流器,在matlab/simulink中实现。电流内环采用三个滞环比较器,电压外…

C#,码海拾贝(38)——求解“线性方程组”的“高斯-赛德尔迭代法”之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

Nacos架构与原理 - 自研 Distro 协议 (AP分布式协议)

文章目录 背景设计思想Distro 协议工作原理数据初始化数据校验写操作读操作 小结 背景 Distro 协议是 Nacos 社区自研的⼀种 AP 分布式协议&#xff0c;是面向临时实例设计的⼀种分布式协议&#xff0c;其保证了在某些 Nacos 节点宕机后&#xff0c;整个临时实例处理系统依旧可…

VMware Workstation 17 安装教程

哈喽&#xff0c;大家好。今天一起学习的是VMware Workstation 17的安装&#xff0c;vm虚拟机是小编非常喜欢的生产力软件&#xff0c;小编之前发布的测试教程钧在vm上进行的实验。 VMware Workstation是一款功能强大的桌面虚拟计算机软件&#xff0c;它能够让用户在宿主机操作…

mac 电脑CPU温度怎么看?怎么可以监控Mac CPU温度,为什么我的 MacBook Air 这么热?

众所周知&#xff0c;电脑温度太高会直接影响到系统运行速度&#xff0c;对硬盘伤害也是很大的。特别是夏天&#xff0c;Mac 笔记本有时候运行起来会比较烫。关于 Mac 笔记本的散热&#xff0c;见仁见智。但是我们也比较好奇 CPU、电池的温度。怎么查看Mac CPU温度呢&#xff1…