【OpenCV 例程 300篇】219. 添加数字水印(盲水印)

article/2025/11/7 13:37:15

OpenCV 例程200篇 总目录


【youcans 的 OpenCV 例程 300篇】219. 添加数字水印(盲水印)

8.2 添加数字盲水印

数字水印,是指将特征信息嵌入音频、图像或是视频等数字信号中。

数字水印分为明水印和盲水印(blind watermark)。明水印包含的信息在观看图像或视频时可以看到。盲水印是以数字数据的方式嵌入图像中,在一般条件下是看不到的,需要特殊处理后才能提取到水印信息。盲水印也称为隐藏式水印,可以实现信息隐藏、版权认证、身份认证、数字签名等功能。

最低有效位(Least significant bit)盲水印,是最简单方便的盲水印实现方法。该方法的原理是将数字水印信息保存为二值图像,嵌入到原始图像的最低位,即将原始图像的最低有效位替换为水印图像。

以 8 位灰度图像为例,原始图像中像素点 P 的灰度值由 8 位二进制数 ( p 7 , p 6 , . . . , p 1 , p 0 ) (p_7, p_6,...,p_1,p_0) (p7,p6,...,p1,p0) 表示,二值水印图像中像素点的像素值由 1 位二进制数 b 0 b_0 b0 表示。用水印图像的像素值 b 0 b_0 b0 替换原始图像的最低有效位 p 0 p_0 p0,就得到嵌入水印的 8 位二进制数 ( p 7 , p 6 , . . . , p 1 , b 0 ) (p_7, p_6,...,p_1,b_0) (p7,p6,...,p1,b0)

提取盲水印的过程与嵌入水印相反,从嵌入水印的原始图像 8 位二进制数 ( p 7 , p 6 , . . . , p 1 , b 0 ) (p_7, p_6,...,p_1,b_0) (p7,p6,...,p1,b0) 中,分离最低有效位 b 0 b_0 b0 生成水印图像。

提取盲水印的过程,则是对于嵌入水印的原始图像,将 8 位二进制数 ( p 7 , p 6 , . . . , p 1 , b 0 ) (p_7, p_6,...,p_1,b_0) (p7,p6,...,p1,b0) 的最低有效位置零。


例程 A4.11:在灰度图像添加数字盲水印

    # A4.10 在灰度图像嵌入数字盲水印img = cv.imread("../images/imgLena.tif", 0)  # 加载原始图片,单通道watermark = cv.imread("../images/logoCV.png", 0)  # # 加载水印图片,单通道markResize = cv.resize(watermark, img.shape[:2])  # 调整图片尺寸与 img 大小相同_, binary = cv.threshold(markResize, 175, 1, cv.THRESH_BINARY)  # 0/1 二值图像# 对原始图像嵌入水印# img (g7,g6,...g1,0) AND 254(11111110) -> imgH7: (g7,g6,...g1,0)imgH7 = cv.bitwise_and(img, 254)  # 按位与运算,图像最低位 LSB=0# imgH7: (g7,g6,...g1,0) OR b -> imgMark: (g7,g6,...g1,b)imgMark = cv.bitwise_or(imgH7, binary)  # (g7,g6,...g1,b)# 从嵌入水印图像中提取水印# extract = np.mod(imgMark, 2)  # 模运算,取图像的最低位 LSBextract = cv.bitwise_and(imgMark, 1)  # 按位与运算,取图像的最低位 LSBplt.figure(figsize=(9, 6))plt.subplot(221), plt.title("original gray"), plt.axis('off')plt.imshow(img, cmap='gray')plt.subplot(222), plt.title("watermark"), plt.axis('off')plt.imshow(binary, cmap='gray')plt.subplot(223), plt.title("embedding watermark"), plt.axis('off')plt.imshow(imgMark, cmap='gray')plt.subplot(224), plt.title("extracted watermark"), plt.axis('off')plt.imshow(extract, cmap='gray')plt.tight_layout()plt.show()

在这里插入图片描述


例程 A4.12:在彩色图像各通道嵌入不同内容的数字盲水印

把彩色图像的各个通道分离处理,可以嵌入相同内容的数字水印,也可以嵌入不同内容的数字水印。

    # A4.12 在彩色图像各通道嵌入不同内容的数字盲水印img = cv.imread("../images/imgLena.tif", 1)  # 加载原始图片,单通道# 加载或生成水印信息watermark = cv.imread("../images/logoCV.png", 0)  # # 加载水印图片,单通道markResize = cv.resize(watermark, img.shape[:2])  # 调整图片尺寸与 img 大小相同_, binary = cv.threshold(markResize, 175, 1, cv.THRESH_BINARY)  # 0/1 二值图像mark1 = np.ones(img.shape[:2], np.uint8)cv.putText(mark1, str(np.datetime64('today')), (50, 100), cv.FONT_HERSHEY_SIMPLEX, 2, 0, 2)cv.putText(mark1, str(np.datetime64('now')), (50, 150), cv.FONT_HERSHEY_DUPLEX, 1, 0)mark2 = np.ones(img.shape[:2], np.uint8)cv.putText(mark2, "200 examples for OpenCV", (50, 300), cv.FONT_HERSHEY_SIMPLEX, 2, 0, 2)cv.putText(mark2, "Copyright@youcans, 2022", (50, 350), cv.FONT_HERSHEY_DUPLEX, 1, 0)# 对原始图像嵌入水印# img: (g7,g6,...g1,0) -> imgH7: (g7,g6,...g1,0)imgH7 = (img >> 1) << 1  # 右移->左移,图像最低位 LSB=0# imgH7: (g7,g6,...g1,0) OR b -> imgMark: (g7,g6,...g1,b)# 对各通道分别插入数字水印 binary,mark1,mark2b = cv.bitwise_or(imgH7[:, :, 0], binary)  # (g7,g6,...g1,b)g = cv.bitwise_or(imgH7[:, :, 1], mark1)  # (g7,g6,...g1,m1)r = cv.bitwise_or(imgH7[:, :, 2], mark2)  # (g7,g6,...g1,m2)imgMark = cv.merge([b, g, r])# # 从嵌入水印图像中提取水印b, g, r = cv.split(imgMark)  # 拆分为 BGR 独立通道bMark = cv.bitwise_and(b, 1)  # 按位与运算,取 B 通道的最低位 LSBgMark = cv.bitwise_and(g, 1)  # 按位与运算,取 G 通道的最低位 LSBrMark = cv.bitwise_and(r, 1)  # 按位与运算,取 R 通道的最低位 LSBplt.figure(figsize=(9, 6))plt.subplot(231), plt.title("original gray"), plt.axis('off')plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))plt.subplot(232), plt.title("watermark"), plt.axis('off')plt.imshow(binary, cmap='gray')plt.subplot(233), plt.title("embedding watermark"), plt.axis('off')plt.imshow(cv.cvtColor(imgMark, cv.COLOR_BGR2RGB))plt.subplot(234), plt.title("watermark ch-B"), plt.axis('off')plt.imshow(bMark, cmap='gray')plt.subplot(235), plt.title("watermark ch-G"), plt.axis('off')plt.imshow(gMark, cmap='gray')plt.subplot(236), plt.title("watermark ch-R"), plt.axis('off')plt.imshow(mark2, cmap='gray')plt.show()

在这里插入图片描述


【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125506913)
Copyright 2022 youcans, XUPT
Crated:2022-7-5
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中

218. 多行倾斜文字水印
219. 添加数字盲水印


http://chatgpt.dhexx.cn/article/n9bk5Bhp.shtml

相关文章

照片里的盲水印

这个题是安恒月赛里面的一道misc类型的题&#xff0c;在CTF中misc所谓最考验你的脑洞和检验你的赛事水平&#xff08;赛棍&#xff1f;&#xff1f;&#xff1f;&#xff09; 但是这个方面还是要看一下&#xff0c;就当做开发脑力了。 题目&#xff1a;暴力可解 题目文件 下载…

[python] 基于blind-watermark库添加图片盲水印

blind-watermark是一个能够给图片添加/解析基于频域的数字盲水印的Python库。图像水印image watermark是指在图片里添加文本或图形&#xff0c;以标记图片的来源。但是图像水印会破坏原图。因此另外一种水印形式&#xff0c;即图像盲水印blind image watermark在实践中更多地用…

图片盲水印软件

bulid_watermark_gui Blind&Invisible Watermark &#xff08;图片盲水印&#xff0c;提取水印无须原图&#xff01;) 增加图形界面 项目地址&#xff1a;github开源 软件下载地址&#xff1a;无需环境软件下载 how to use pip install -r requirements.txt 运行main.py…

隐写术(盲水印):从入门到出门

0. 前言 我在做 Blind Watermark 这个库的时候&#xff0c;翻阅了大量材料&#xff0c;学到了关于隐写术、盲水印的很多知识&#xff0c;现在梳理了一遍&#xff0c;发出来。 本文结构&#xff1a; 简介&#xff1a;隐写术的应用场景、分类、特点隐写术&#xff1a;介绍几种…

图片隐写,盲水印,加密logo

1.定义 隐写术算是一种加密技术&#xff0c;权威的 wiki 说法是“ 隐写术是一门关于信息隐藏的技巧与科学&#xff0c;所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。” example&#xff1a; 钱图&#xff08;钱上面的水印&#xff0…

CTF盲水印详解

原创稿件征集 邮箱&#xff1a;eduantvsion.com QQ&#xff1a;3200599554 黑客极客技术、信息安全热点安全研究分析等安全相关的技术文章 稿件通过并发布还能收获 200-800元不等的稿酬 前言 在CTF杂项题型中&#xff0c;盲水印的出现频率是相当高的&#xff0c;但大多数人处于…

盲水印(Blind-WaterMark)

盲水印是一种肉眼不可见的水印方式&#xff0c;对图片资源使用图片盲水印或者文字水印&#xff0c;借此避免数字媒体未经授权的复制和拷贝&#xff0c;可通过对原图进行解码操作&#xff0c;得到水印图来证明版权归属。 这类盲水印是怎样实现的呢&#xff1f;原理并不复杂&…

Windows系统通过CMD连接MySql

1.按压WindowsR快捷键后输入"cmd" 2.点击"确定"按钮后打开命令行 3.通过输入"cd"MySql安装的bin目录&#xff0c;按压"Enter"后进入MySql安装的bin目录 4.输入"mysql -h localhost -u root -p"&#xff0c;此处-h后为对应ho…

cmd中无法连接MySQL

本人电脑是win10系统&#xff0c;安装的是MySQL5.7版本的&#xff0c;最近在登录MySQL的时候老师出现下面的错误&#xff0c;有的时候重启电脑耶也会出现这样的情况 1.先检查你的环境变量是否配置好了&#xff1b; &#xff08;如果没有配置好&#xff0c;请参考一下的步骤&am…

如何使用cmd安装MySQL

步骤一&#xff1a; 在官网MySQL&#xff1a; 点击download显示下载页面&#xff1a; 点击 MySQL community download&#xff08;这个适个人合开发者&#xff0c;免费的&#xff0c;之前的MySQL Enterprise Edition是企业版付费需要 &#xff0c;MySQL cluster CGE 是免费版但…

navicat或者cmd远程连接mysql数据库

问题产生&#xff1a; 一般情况下&#xff0c;MySql数据库是不允许进行远程连接操作的&#xff0c;强行使用Navicat连接会报出下面的错误。 服务器连接错误主机XXX不允许连接到此的MySQL的服务器 方法步骤&#xff1a; 1、远程登录授权 在服务器端进行操作&#xff0c;下…

cmd窗口无法连接MySQL的解决方法

1.将下载Mysql中的bin目录的路径配置到Path环境变量中&#xff1b; 2.winR&#xff0c;输入services.msc&#xff0c;到服务窗口找到mysql服务&#xff0c;其中mysql的服务名可能是mysqlxx而不是mysql&#xff0c;比如我的是mysql80&#xff0c;找到之后点击&#xff0c;然后在…

cmd启动MySQL

命令行启动MySQL step1&#xff1a;打开命令行&#xff1a;win R step2&#xff1a;输入如下命令&#xff0c;root与1234分别为MySQL的用户名与密码 mysql -uroot -p1234出现如下信息即为启动成功 如果连接失败 显示如下错误信息&#xff1a; ERROR 2003 (HY000): Cant …

cmd的mysql命令_MySQL cmd命令

1.MySQL 登录: mysql -h localhost -u root -p test Enter password: ***** -h 指定数据库主机名,默认时登录主机。-u指定用户名(即安装数据库时的设置的用户名)。-p指明登录需要密码,如果没有密码,可省略-p参数。 -p 后面的test并不是密码,而是要登录的数据库名。如果-p后…

cmd命令创建连接MySQL数据库

欢迎大家关注我的公众号【老周聊架构】&#xff0c;Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 一、连接MYSQL 格式&#xff1a; mysql -h 主机地址 -u 用户名 -p 用户密码1、 连接到本机上的MYSQL。 首先打开DOS窗口&#…

解决在cmd情况下无法连接MySQL情况(无脑操作教程)

在输入外部命令&#xff1a;mysql -u root -p的时候&#xff0c;出现下面的情况&#xff1a; &#xff08;网图&#xff0c;侵删&#xff09; 问题分析&#xff1a;可能是MySQL路径问题没有解决&#xff1b; 解决方法&#xff1a;1.打开电脑高级设置&#xff1b; 2.点击环境变…

cmd控制台连接MySQL数据库_如何利用CMD连接本机mysql数据库

从事数据工作的IT人员&#xff0c;很多人都会与Mysql数据库打交道。因为mysql数据库是一个开源的数据库&#xff0c;利用它来学习数据库的人也有很多。笔者今天就给大家分享一下&#xff0c;安装好mysql之后&#xff0c;怎么利用CMD连接本机mysql数据库。 1.首先第一步是需要我…

cmd指令连接mysql数据库,以及创建数据库与表

cmd指令连接mysql数据库&#xff0c;以及创建数据库与表 1&#xff0c; 打开命令提示符cmd&#xff08;直接搜索cmd回车&#xff09; 2&#xff0c;进入mysql&#xff0c;在cmd命令行输入mysql -uroot -p,然后输入你的mysql密码&#xff0c;成功后进入数据库 3,查看mysql中的…

如何连接Mysql

利用services.msg命令 ctrlr&#xff0c;输入命令&#xff1a;services.msc 在“服务”中找到并开启MySQL即可 利用cmd命令 ①按住快捷键winr&#xff0c;打开“运行”命令。 ②输入cmd&#xff0c;运行进入命令提示符界面。 ③在cmd中&#xff0c;输入mysql -u root -p…

CMD连接MySQL,本地phpAdmin登陆

Ⅰ.cmd连接数据库 方法一 1.WINR输入CMD&#xff0c;进入到数据库安装的盘路径&#xff08;cd\&#xff0c;会进入c盘根目录&#xff0c;再d:就进入d盘了&#xff0c;再cd 进入你数据库的安装路径&#xff09; 2.输入mysql -P 端口号 -h mysql的主机名\ip -u root&#xff0…