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

OpenCV 例程200篇 总目录


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

8.2 添加数字盲水印

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

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

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

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

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

提取盲水印的过程,则是对于嵌入水印的原始图像,将 8 位二进制数 (p7,p6,...,p1,b0)(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://www.mzph.cn/news/565374.shtml

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

相关文章

搜索栏联想词提示

在我们需要游览一些网站的时候&#xff0c;我们经常需要使用搜索引擎来进行搜索&#xff0c;无论是百度谷歌还是搜狐等&#xff0c;我们都需要在搜索栏中输入相关的搜索词&#xff0c;当我们点击进行输入的时候&#xff0c;下面会给出许许多多的提示词&#xff0c;程序自动联想…

【OpenCV 例程200篇】220.对图像进行马赛克处理

文章目录&#xff1a;『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】220.对图像进行马赛克处理 9. 图像的马赛克处理 马赛克效果是广泛使用的图像和视频处理方法。将图像中指定区域的色阶细节劣化&#xff0c;造成色块模糊的效果&#xff0c;看上…

【OpenCV 例程200篇】223. 特征提取之多边形拟合(cv.approxPolyDP)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】223. 特征提取之多边形拟合 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目标…

Eclipse快捷键生成语句

当我们使用Eclipse进行项目的开发的时候&#xff0c;有的时候我们需要重复输入main方法和输出语句等&#xff0c;下面就教给大家如何在Eclipse开发中使用快捷键生长main方法和输出语句。 快捷键生成语句 生成main方法&#xff1a;输入"main" &#xff0c;按ALT/&…

【OpenCV 例程200篇】221.加密马赛克图像处理与解密复原

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】221.加密马赛克图像处理与解密复原 9. 图像的马赛克处理 马赛克效果是广泛使用的图像和视频处理方法。将图像中指定区域的色阶细节劣化&#xff0c;造成色块模糊的效果&#xff0c;看上去像是一个个…

小网站asp好还是php好,网站程序是asp好还是php好,哪个更利于优化?

网站程序是asp好还是php好呢&#xff1f;如果我们要做seo优化&#xff0c;哪一个又更利于优化呢&#xff1f;毕竟&#xff0c;现在在网上所看到的程序&#xff0c;是比较多的&#xff0c;选择一个好的网站程序&#xff0c;可以少走很多弯路。如果&#xff0c;大家建一个网站是为…

Java IO深入

IO体系 Java IO 体系种类繁多&#xff0c;感觉很复杂&#xff0c;但其实是 IO 涉及的因素太多了。在进行介绍的时候添加了设计模式等的使用&#xff0c;会让你感觉更加难以理解难以使用这些IO类&#xff0c;在此对java的IO做了一个详细的总结。 IO 类设计出来&#xff0c;肯定…

【OpenCV 例程200篇】222. 特征提取之弗里曼链码(Freeman chain code)

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】222. 特征提取之弗里曼链码&#xff08;Freeman chain code&#xff09; 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff…

【OpenCV 例程200篇】224. 特征提取之提取骨架

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】224. 特征提取之提取骨架 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目标区域。 特征通常是针…

inuri .php id=,php常用函数(遇见就补充)

preg_match()preg_match(string pattern, string subject [, array matches [, int flags]])在subject字符串中搜索与 pattern给出的正则表达式相匹配的内容。如果提供了 matches&#xff0c;则会被搜索的结果所填充。$matches[0]将包含于整个模式匹配的文本&#xff0c;$match…

【OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率 特征通常是针对于图像中的某个目标而言的。 我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目标区域。图像分割之后&#xff0c;还要对目标区域进…

Java常见的几种设计模式

单例模式 指一个应用程序中&#xff0c;某个类的实例对象只有一个&#xff0c;你没有办法去new&#xff0c;因为构造器是被private修饰的&#xff0c;一般通过getInstance()的方法来获取它们的实例。 getInstance()的返回值是一个对象的引用&#xff0c;并不是一个新的实例&a…

【OpenCV 例程200篇】227. 特征描述之 LBP 纹理特征算子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】227. 特征描述之 LBP 纹理特征算子 特征通常是针对于图像中的某个目标而言的。 针对目标所在区域的特征描述符&#xff08;Region descriptors&#xff09;&#xff0c;称为区域特征描述子。 4.2 纹…

【OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子 特征通常是针对于图像中的某个目标而言的。针对目标所在区域的特征描述符&#xff08;Region descriptors&#xff09;&#xff0c;称为区域特征描述子。 局部…

【OpenCV 例程200篇】229. 特征描述之 LBP 算子比较(skimage)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】229. 特征描述之 LBP 算子比较&#xff08;skimage&#xff09; 局部二值模式&#xff08;LBP&#xff0c;Local binary patterns&#xff09;是一种用来描述图像局部纹理特征的算子&#xff0c;它具…

Java多线程的使用

无论在我们的工作中还是在我们的生活中&#xff0c;我们都会用到多线程的知识&#xff0c;今天就给大家讲一下如何使用多线程。 序幕 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 我们首先要知道进程和线程分别是什么&#xff1f; 进程 - 进…

oracle 存储过程 db,oracle数据库的存储过程是什么?

oracle数据库的存储过程&#xff1a;一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中。存储过程是由流控制和SQL语句书写的过程&#xff0c;这个过程经编译和优化后存储在数据库服务器中&#xff0c;应用程序使用时只要调用即可。存储过程(Stored Procedur…

【OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图 局部二值模式&#xff08;LBP&#xff0c;Local binary patterns&#xff09;是一种用来描述图像局部纹理特征的算子&#xff0c;它具有旋转不变性和灰度不变性的优点…

【OpenCV 例程200篇】232. 特征描述之频谱方法

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】232. 纹理特征之频谱方法 4.3 纹理特征之频谱方法 傅里叶谱可以描述图像中的周期性或半周期性二维模式的方向性&#xff0c;因此可以基于傅里叶变换对纹理进行频谱分析。 纹理与图像频谱中的高频分…

java制作oracle程序,Java程序操作Oracle两种方式之简单实现

Java程序操作Oracle两种方式之简单实现1.通过JDBC-ODBC桥连接Oracle数据库(1)创建odbc源&#xff0c;在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名为wangtao,选择一个Service,输入用户名密码&#xff0c;测试连接&#xff0c;若通过说明成功&#xff1b;(注意&…