使用Python在计算机视觉中为图像添加水印2025 年 1 月 5 日 | 阅读 9 分钟 概述水印是为图像添加独特图案的过程。它对于保护文档免遭不当使用或侵犯版权至关重要。数字资产的权利或信誉授予作者和企业主,以防止未经授权复制或抄袭他们的作品。水印可以产生独特且唯一的印章、签名或商标。 引言强大的 Python 库 OpenCV 允许我们执行许多重要操作。该库可用于跟踪相机运动、创建图像滤镜、提取任何对象的 3D 模型以及应用水印。一个名为 cv2.addWeighted() 的 OpenCV 方法可用于在图像上添加水印。 语法 参数 src1:输入的原始图像。alpha:输入的原始图像的权重。src2:用作输入的图像。beta:输入的第二个图像的权重。gamma:混合后,将标量值应用于每个像素。 让我们继续开发此函数,以使用不同的实现策略在照片上创建各种水印。 水印的类型然而,在开始为照片添加水印之前,您必须了解不同类型的水印及其应用。 可见水印 顾名思义,查看者很可能会立即注意到水印。基本上,半透明的 ID 被放置在原始照片上。这些标识符可以是文本、地址、URL、徽标、二维码或任何显示照片所有权的物品。尽管它们是半透明的,但这些允许您查看原始图像。 用于图像的广告和版权保护的最佳水印是可见的。在识别图像侵权方面,它们几乎无效。但是,使用合适的工具可以轻松地删除、裁剪或用另一个水印覆盖它们。但每个优势都有代价。 不可见水印 不可见水印也可以称为隐蔽或隐藏水印。顾名思义,它们是不可见的,肉眼无法察觉。要查看它们,您需要特定的隐写术软件或硬件。 有几种类型的水印是不可检测的。
基于文本的水印 让我们创建一个包含将成为图像水印的文本的字符串。下一步是自定义字体样式。OpenCV 带有多种预装字体样式。(255, 255, 255) 将导致水印文本显示为白色。最后,我们可以使用 putText() 函数将水印文本添加到图像中。 说明 提供的代码首先使用 OpenCV 读取并显示图像。接下来,它会创建一个名为 watermark_text 的空白图像,该图像的尺寸与原始图像相同,但像素值为黑色(零)。代码使用给定的字体、大小和位置在空白图像上书写文本“CLICKS”。然后,为了产生水印效果,使用 cv2.addWeighted 函数将此水印文本与原始图像混合,该函数以定义的权重(alpha 和 beta)混合两个图像。结果显示水印文本以略微半透明的方式叠加在原始图像之上。此方法可确保水印可见,而不会完全隐藏底层图像。 输出 ![]() ![]() ![]() 基于图像的水印 以下是有关使用 OpenCV 在图像上应用基于图像的水印的一些重要详细信息
添加水印的技术数字水印技术 水印是将信息所有者明确指定的附加信息添加到源(封面)数据中的技术。数字水印将所有者的视觉信息隐藏在原始视觉数据中。它通常用于涉及照片和视频的应用。 相反,数字水印将标记合并到数据中,以至于源的消费者几乎注意不到变化。即使水印材料经过严重修改,秘密信息仍然可见,无法被擦除。 水印有多种类型,包括可见、不可见和双重。水印算法可以基于修改或地理领域。空间域水印涉及修改照片的一个或多个随机选定部分的像素值。图像像素立即接收原始数据。它可以基于使用不同的块或最低有效位平面。变换域水印基于变换系数的修改。DCT 和 DWT 是两种常用的变换域方法。 空间域技术 数字水印,通常称为空间域水印,是将所有者指定的附加水印数据添加到原始(封面)图像或视频的过程。像素用于在空间区域定义图像。空间域水印过程会改变少量选定像素的颜色和亮度,以合并水印。与变换域相比,空间域水印更快、更容易使用,但它更容易受到攻击。空间域技术可以轻松应用于任何图像。对于空间域,最常用的水印算法是最低有效位修改。此方法会修改图像选定像素的最低有效位(LSB)。可以使用类似的方法来处理容器图像的其他 LSB 位。 水印项可以在容器图像中出现多次。即使攻击删除了大部分水印,只要留下一个水印就足够了。这是一个相当简单的方法。它能抵抗裁剪和噪声添加等简单操作。但是,有损压缩会使水印失效。此外,可以通过将所有 LSB 位更改为“1”的直接攻击来擦除封面对象中的水印,而不会造成明显损坏。 从水印图像中删除 LSB 平面后,使用异或运算和水印模板检索水印。 可以对封面图像进行预处理,以防止隐藏信息被直接从预处理中提取。预处理封面图像的一种方法是将其分解为块。接下来,会改变相邻块的关系来编码嵌入的水印。 频域技术 频域水印的基本目标是将水印包含在图像的频谱系数中。最常用的三种变换是离散小波变换 (DWT)、离散傅里叶变换 (DFT) 和离散余弦变换 (DCT)。离散余弦变换 (DCT) 域水印可以抵抗锐化、滤波、噪声和压缩等攻击。标准的 JPEG 压缩方法是其基础,而水印是一个可选功能。DCT 变换数字水印会改变频率系数,而空间域水印会改变图像位平面的像素 LSB。 由于 DCT 允许将图像分解为多个频带,因此它简化了将水印数据插入图像频带的过程。嵌入在中频范围是合适的。它增强了对通常会放大高频的攻击的防御能力。通过采用中频,还可以避免图像中最具美感的区域(集中在低频)。原始图像被分解为 8x8 像素块,并且 DCT 变换独立地应用于每个块。可以通过使用中频 2D 掩码从中频范围提取 DCT 系数。现代小波变换方法广泛应用于水印、压缩、数字图像处理和其他相关任务。变换基于小波,小波是具有有限周期和可变频率的小波。 小波变换将图像分解为三个空间方向:对角线、水平和垂直。在每个分解级别,DWT 系数的幅度在最低频带 (LL) 中较大,而在其他频带 (HH, LH, 和 HL) 中较小。因此,小波能更好地表示 HVS 的各向异性特性。 许多信号处理应用,包括音频和视频压缩、音频背景噪声消除以及无线天线布局建模,都普遍使用 **离散小波变换 (DWT)**。 **离散傅里叶变换 (DFT)** 可以将连续函数分解为其频率分量。它对平移、缩放、旋转和裁剪等几何攻击免疫。 DFT 显示了平移不变性。图像的空间变化不会影响傅里叶变换的幅度,而是会改变图像的表征方式,即改变其相位而不是幅度。 变换域技术 在变换域中,图像以频率表示。许多可逆变换,如离散余弦变换 (DCT)、离散小波变换 (DWT)、离散傅里叶变换 (DFT)、轮廓波变换 (CT) 和奇异值分解 (SVD),可用于将图像转换为其频率表示。每种变形都有独特的特性,并以不同的方式呈现图像。 DCT 水印:此方法包括修改 DCT 系数,以便将水印嵌入图像的 DCT 域中。 小波变换水印:此方法通过使用小波变换将图像分解为不同的频率子带,将水印嵌入高频子带中。 奇异值分解 (SVD) 水印:此方法使用 SVD 将图像分解为其奇异值矩阵,并将水印嵌入奇异值中。 水印在计算机视觉中的应用
水印的挑战和局限性尽管它可能是内容身份验证和版权保护的有用工具,但也有一些需要考虑的事项。
因此,虽然水印可以使内容保护和身份验证受益,但在设计水印系统之前需要考虑这些缺点和挑战。 结论
下一个主题Python 中的退出方法 |
? 简介 Python 以其简洁性和可读性而闻名,提供了丰富的特性,使其成为许多开发者的首选。其中一个这样的组件是切片,一种允许你从字符串、列表和元组等序列中提取部分的策略。切片不是...
阅读 6 分钟
Campello、Moulavi 和 Sander 发明了名为 . 的聚类算法。通过将 DBSCAN 转换为层次聚类算法,然后采用一种从聚类稳定性中提取平面聚类的方法,它扩展了原始算法。本笔记本旨在提供...
11 分钟阅读
?Pandas 是一个流行的 Python 数据操作库,它通过其 DataFrame 结构提供了一种方便的方式来处理表格数据。一项常见的任务是将这些 DataFrame 导出到 Excel 文件。有时,您可能拥有多个数据框,需要...
阅读 4 分钟
Snowflake Snowpark for Python 是一项改变游戏规则的功能,它将数据工程、数据科学和分析集成到 Snowflake 生态系统中。借助 Snowpark,开发人员可以在 Snowflake 环境中原生运行 Python 代码,从而消除数据移动的低效率。它是一个无缝、高性能的平台,适用于数据密集型...
阅读 4 分钟
简介:在本教程中,我们将学习 . AFDKO 是一个旨在从 PostScript 和 TrueType 字体文件中创建 OpenType 字体文件的工具。它是一套用于字体创建和操作的综合工具。它特别适用于 OpenType 字体。它提供...
阅读 4 分钟
简介 今天,它是数据分析和自动化领域最简单、最受欢迎的语言之一。它通常用于电子表格数据。尽管如此,当涉及到...时,有时人们需要将 Excel 文件转换为 PDF 格式。
阅读 3 分钟
Python 是一种高级的解释型编程语言,以其简洁性和可读性而闻名,使其成为新手和经验丰富的开发人员的流行选择。它通过大量使用缩进来强调代码可读性。Python 支持多种编程范式,包括过程式、面向对象和...
阅读 4 分钟
简介 类似于 Unix 的操作系统有一个称为伪终端(PTY)的功能,它允许应用程序模拟真实终端的行为。这对于构建基于终端的应用程序、自动化任务以及执行交互式命令行程序等非常有帮助。您可以建立、管理和...
阅读 4 分钟
从 PDF 报告中提取文本是信息科学、学术研究和商业智能等不同领域的常见先决条件。本指南将探讨使用 Python 从 PDF 文档中提取文本的各种技术,详细介绍 PyPDF2、pdfminer.six 和...等库。
阅读 6 分钟
在 Python Flask 中,当您需要从路由返回 JSON 响应时,您可能会考虑使用 json.dumps() 方法来序列化您的数据。但是,Flask 提供了一种更方便、更 Flask 特定的方法来实现此目的:jsonify() 函数。在本文中,我们将...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India