Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果

news2024/11/13 9:32:24

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果

一、简单介绍

二、简单图片添加水印效果实现原理

三、简单图片添加水印效果案例实现简单步骤

四、注意事项


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单图片添加水印效果实现原理

给图片添加水印是指在图片上叠加额外的标识、文字、图形或者其他图像,以表明该图片的归属、来源、版权信息或者其他附加信息的过程。水印通常以半透明的方式显示在图片的某个位置,可以防止未经授权的复制和使用,并且可以提升图片的专业性和美观度。添加水印的过程可以通过图像处理技术来实现,包括图像叠加、透明度调整、文字绘制等。

  1. 添加文字水印 (add_watermark_text)

    • 原理:在原始图像上绘制指定的文字,作为水印。
    • 实现方法:使用 OpenCV 的 cv2.putText() 函数在图像上添加文字。
  2. 添加图片水印 (add_watermark_image)

    • 原理:将水印图片叠加到原始图像的指定位置。
    • 实现方法:将水印图片的 BGR 通道与原始图像的相应区域进行叠加,同时考虑水印图片的 alpha 通道,控制水印的透明度。

涉及的一些函数说明:

  1. cv2.putText()

    • 函数功能:在图像上绘制文本。
    • 参数:
      • image:要绘制文本的图像。
      • text:要绘制的文本内容。
      • org:文本的起始坐标,即文本左下角的坐标。
      • font:字体类型,默认为 cv2.FONT_HERSHEY_SIMPLEX
      • font_scale:字体缩放因子。
      • font_color:文本颜色,格式为 BGR。
      • thickness:文本线条粗细。
    • 返回值:无。
    • 注意事项:根据 org 参数确定文本的起始位置,确保文本不会超出图像范围。
  2. Array slicing (数组切片)

    • 函数功能:用于在图像上获取指定位置的子图像。
    • 参数:用于指定图像区域的坐标和大小。
    • 返回值:返回指定区域的子图像。
    • 注意事项:确保指定的区域不会超出图像范围。
  3. cv2.addWeighted()

    • 函数功能:对两个图像进行加权求和,实现图像叠加效果。
    • 参数:
      • src1:第一个输入图像。
      • alpha:第一个输入图像的权重。
      • src2:第二个输入图像。
      • beta:第二个输入图像的权重。
      • gamma:结果图像的亮度值,添加到加权和上。
    • 返回值:返回加权和后的图像。
    • 注意事项:通过调整 alphabeta 参数可以控制两个图像的显示比例,通过 gamma 参数可以调整结果图像的亮度。

三、简单图片添加水印效果案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

"""
简单图片添加水印效果
"""

import cv2


def add_watermark_text(image, text, position='bottom-right', x=None, y=None, font=cv2.FONT_HERSHEY_SIMPLEX,
                       font_scale=1.0, font_color=(255, 255, 255), thickness=1):
    """
    简单添加文字水印效果
    :param image:
    :param text:
    :param position:
    :param x:
    :param y:
    :param font:
    :param font_scale:
    :param font_color:
    :param thickness:
    :return:
    """
    # 复制原始图像,以免修改原始图像
    result = image.copy()

    # 确定水印文本的位置
    text_size, _ = cv2.getTextSize(text, font, font_scale, thickness)
    image_height, image_width = image.shape[:2]
    if position == 'top-left':
        text_position = (10, text_size[1] + 10)
    elif position == 'top-right':
        text_position = (image_width - text_size[0] - 10, text_size[1] + 10)
    elif position == 'bottom-left':
        text_position = (10, image_height - 10)
    elif position == 'center':
        text_position = ((image_width - text_size[0]) // 2, (image_height + text_size[1]) // 2)
    else:  # 默认为 'bottom-right'
        text_position = (image_width - text_size[0] - 10, image_height - 10)

    # 如果用户指定了位置,则使用用户指定的位置
    if x is not None and y is not None:
        text_position = (x, y)

    # 添加水印文本
    cv2.putText(result, text, text_position, font, font_scale, font_color, thickness)

    return result


def add_watermark_image(image, watermark_image, position='bottom-right', x=None, y=None):
    """
    简单添加图片水印效果
    :param image:
    :param watermark_image:
    :param position:
    :param x:
    :param y:
    :return:
    """
    # 复制原始图像,以免修改原始图像
    result = image.copy()

    # 确定水印图片的位置
    watermark_height, watermark_width = watermark_image.shape[:2]
    image_height, image_width = image.shape[:2]
    if position == 'top-left':
        watermark_position = (0, 0)
    elif position == 'top-right':
        watermark_position = (image_width - watermark_width, 0)
    elif position == 'bottom-left':
        watermark_position = (0, image_height - watermark_height)
    elif position == 'center':
        watermark_position = ((image_width - watermark_width) // 2, (image_height - watermark_height) // 2)
    else:  # 默认为 'bottom-right'
        watermark_position = (image_width - watermark_width, image_height - watermark_height)

    # 如果用户指定了位置,则使用用户指定的位置
    if x is not None and y is not None:
        watermark_position = (x, y)

    # 获取水印图片的 alpha 通道
    watermark_alpha = watermark_image[:, :, 3] / 255.0

    # 提取水印图片的 BGR 通道
    watermark_bgr = watermark_image[:, :, :3]

    # 将水印图片叠加到原始图像上
    for c in range(3):
        result[watermark_position[1]:watermark_position[1] + watermark_height,
        watermark_position[0]:watermark_position[0] + watermark_width, c] = \
            (1 - watermark_alpha) * result[watermark_position[1]:watermark_position[1] + watermark_height,
                                    watermark_position[0]:watermark_position[0] + watermark_width, c] + \
            watermark_alpha * watermark_bgr[:, :, c]

    return result


def main():
    # 调用函数并指定输入图像、水印和输出图像文件路径
    input_image_path = "Images/DogFace.jpg"
    watermark_path = "Images/Watermark.png"
    output_image_path = "Images/DogFace_Watermark.jpg"

    image = cv2.imread(input_image_path)

    # 设置窗口属性,并显示图片
    cv2.namedWindow("Dog", cv2.WINDOW_KEEPRATIO)
    cv2.imshow('Dog', image)

    output_image = add_watermark_text(image, "Water mark", x=200, y=300, font_scale=2.0, thickness=2)

    # 保存处理后的图像
    # 设置窗口属性,并显示图片
    cv2.namedWindow("add_watermark_text", cv2.WINDOW_KEEPRATIO)
    cv2.imshow("add_watermark_text", output_image)

    watermark = cv2.imread(watermark_path, cv2.IMREAD_UNCHANGED)
    output_image = add_watermark_image(image, watermark, position="center")

    # 保存处理后的图像
    # 设置窗口属性,并显示图片
    cv2.namedWindow("add_watermark_image", cv2.WINDOW_KEEPRATIO)
    cv2.imshow("add_watermark_image", output_image)

    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

四、注意事项

1、确保水印文本位置不会超出图像范围,可以根据指定的位置参数调整水印的位置。

2、考虑水印图片的 alpha 通道,以防止水印添加后出现黑色边框或不透明度不一致的情况。

3、可以根据需要调整水印图片的显示位置和透明度参数。

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

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

相关文章

自动驾驶时代的物联网与车载系统安全:挑战与应对策略

随着特斯拉CEO埃隆马斯克近日对未来出行景象的描绘——几乎所有汽车都将实现自动驾驶,这一愿景愈发接近现实。马斯克生动比喻,未来的乘客步入汽车就如同走进一部自动化的电梯,无需任何手动操作。这一转变预示着汽车行业正朝着高度智能化的方向…

排序(一)——插入排序 希尔排序

1.直接插入排序 直接插入排序是一种简单的插入排序,它的基本思想是: 把待排序的数据按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的数据都插入完位置,就得到了一个新的有序序列。 我们可以看到他的前提是…

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …

Spring(24) Json序列化的三种方式(Jackson、FastJSON、Gson)史上最全!

目录 一、Jackson 方案(SpringBoot默认支持)1.1 Jackson 库的特点1.2 Jackson 的核心模块1.3 Maven依赖1.4 代码示例1.5 LocalDateTime 格式化1.6 统一配置1.7 常用注解1.8 自定义序列化和反序列化1.9 Jackson 工具类 二、FastJSON 方案2.1 FastJSON 的特…

OpenHarmony实战开发-MpChart图表实现案例。

介绍 MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示&#xf…

Niobe WiFi IoT开发板OpenHarmony内核编程开发——Semaphore

本示例将演示如何在Niobe WiFi IoT开发板上使用cmsis 2.0 接口进行信号量开发 Semaphore API分析 osThreadNew() osThreadId_t osThreadNew(osThreadFunc_t func, void *argument,const osThreadAttr_t *attr )描述: 函数osThreadNew通过将线程添加到活动线程列表…

nvm node.js的安装

说明:部分但不全面的记录 因为过程中没有截图,仅用于自己的学习与总结 过程中借鉴的优秀博客 可以参考 1,npm install 或者npm init vuelatest报错 2,了解后 发现是nvm使用的版本较低,于是涉及nvm卸载 重新下载最新版本的nvm 2…

【TCP套接字编程,UDP套接字编程】

文章目录 TCP套接字编程Socket编程Socket 编程TCP套接字编程TCPsocket编程C/S socket 交互: TCP数据结构 sockaddr_in数据结构 hostent UDP套接字编程UDP Socket编程Client/server socket 交互: UDP TCP套接字编程 Socket编程 应用进程使用传输层提供的服务才能交换报文。实现…

解锁创意无限,体验全新Adobe Illustrator 2021 for mac/Win中文版

在数字化创意的浪潮中,Adobe Illustrator 2021中文版无疑是设计师们的得力助手。这款软件集高效、便捷、创新于一体,无论是Mac还是Windows用户,都能在其中找到属于自己的创意空间。 Adobe Illustrator 2021中文版延续了其强大的矢量图形处理…

mybash---打造自己的命令解释器

目前我们Linux的系统默认的命令解释器是bash; 命令解释器(也称为命令行解释器或shell)是计算机操作系统中的一个重要组件,它负责接收用户输入的命令,并解释和执行这些命令。其实命令解释器就是解析命令,执行命令,输出反馈; 1.命令…

【c 语言】声明了一个指针,会给指针分配内存吗?

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

电商API数据采集接口|跨境卖家在追求精细化运营过程中商品选品以及上架物流几方面应用

跨境电商行业与IT行业资深从业者,知名跨境电商人工智能软件创始人。擅长用RPA机器人技术、aPaaS业务应用平台以及AI人工智能技术为跨境卖家提供新的运营模式和思路,用技术的手段来解决跨境行业的痛点问题。 现在跨境卖家都在追求精细化运营,在…

【Git】Git的安装与常用命令

Git的安装与常用命令 一、Git的安装 (一)下载 官网下载:https://git-scm.com/downloads 镜像网站:https://registry.npmmirror.com/binary.html?pathgit-for-windows/ (二)安装 双击安装&#xff0c…

06-vscode+espidf开发调试方法(内置JTAG调试)

使用VS Code和ESP-IDF进行ESP32开发和调试 在我们搭建 IDF 框架后,OpenOCD 已经自动下载好了, 我们通过 JTAG 接口连接使用 OpenOCD 进行调试。而ESP32芯片中内置 了JTAG 电路,无需额外芯片即可调试,更加方便,所以这里…

开源相机管理库Aravis例程学习(三)——注册回调multiple-acquisition-callback

开源相机管理库Aravis例程学习(三)——回调multiple-acquisition-callback 简介例程代码arv_camera_create_streamArvStreamCallbackTypeArvStreamCallback 简介 本文针对官方例程中的:02-multiple-acquisition-callback做简单的讲解。 ara…

ppt里的音乐哪里来的?

心血来潮,想照着大神的模板套一个类似于快闪的ppt。 ppt里是有一段音乐的,那段音乐就是从幻灯片第二页开始响起的。 但是我就找不到音乐在哪。 甚至我把ppt里的所有素材都删除了,再看动画窗格,仍然是空无一物,显然&…

PyCharm 2024.1 发布:全面升级,助力高效编程!

PyCharm 2024.1 发布:全面升级,助力高效编程! 文章目录 PyCharm 2024.1 发布:全面升级,助力高效编程!摘要引言 Hugging Face:模型和数据集的快速文档预览针对 JavaScript 和 TypeScript 的全行代…

基于有序抖动块截断编码的水印嵌入和提取算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 噪声测试 旋转测试 压缩测试 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................…

基于深度学习网络的鞋子种类识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 load gnet.mat % 使用训练好的网络对验证数据进行分类预测 [Predicted_Label, Probability] c…

基于Canvas实现的简历编辑器

基于Canvas实现的简历编辑器 大概一个月前,我发现社区老是给我推荐Canvas相关的内容,比如很多 小游戏、流程图编辑器、图片编辑器 等等各种各样的项目,不知道是不是因为我某一天点击了相关内容触发了推荐机制,还是因为现在Canvas…