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

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 cv2def 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 resultdef 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 resultdef 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.mzph.cn/news/818870.shtml

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

相关文章

解决VS2022创建项目只有解决方案看不到项目文件

问题:无法运行、看不到项目文件 解决: 检查环境变量是否正确

开源相机管理库Aravis例程学习(一)——单帧采集single-acquisition

开源相机管理库Aravis例程学习(一)——单帧采集single-acquisition 简介源码函数说明arv_camera_newarv_camera_acquisitionarv_camera_get_model_namearv_buffer_get_image_widtharv_buffer_get_image_height 简介 本文针对官方例程中的第一个例程&…

MVSplat:稀疏多视点图像的高效3D高斯溅射

MVSplat: Efficient 3D Gaussian Splatting from Sparse Multi-View Images MVSplat:稀疏多视点图像的高效3D高斯溅射 Yuedong Chen1  Haofei Xu2,3  Chuanxia Zheng4  Bohan Zhuang 粤东陈浩飞徐 2,3 郑传霞 4 庄伯涵1 Marc Pollefeys2,5  Andreas Geiger3  T…

长波热红外应用

长波热红外通常是指波长范围在8至14微米之间的红外辐射。这种红外辐射主要来自于物体的热能,因此也称为热红外辐射。相比于短波红外,长波热红外更适合用于测量和探测物体的温度,因为它们能够捕捉到物体辐射的长波长热能,从而提供更…

web自动化系列-selenium find_elements定位方法详解(八)

接上文 : web自动化测试系列-selenium css_selector定位方法详解(七)-CSDN博客 前面已经介绍了8种定位方法 ,大多数情况下我们都会优先使用这8种方法 。 但有的时候在你选择定位元素时 ,会出现多个同样的定位属性和值 。而且你能选择定位也…

前端框架模板

前端框架模板 1、vue-element-admin vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 **功能:**https://panjiachen.github.io/vue-element-admin-site/zh/guide/#功能 **GitHub地址:**GitHub - PanJiaChen/vue-element-admin: :t…

脚本开发与自动化运维----shell脚本开发及其在DevOps中的应用

一.正则表达式 正则表达式(Regular Expression、regex 或 regexp, 缩写为RE), 又称规则表达式,是计算机科学中的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串(包括普通字符(例如, a 到 z 之间的字母)和特殊字符(称为“…

信也科技网络自动化实践-网络策略管理

1、背景 随着各种法律法规和行业标准的出台和更新,企业或组织需要遵守各种安全合规性要求。网络安全策略管理需要符合这些要求,从而保障企业或组织的安全和合规性。网络安全策略管理需要涵盖企业或组织的整个网络生命周期,包括网络规划、设计…

场景文本检测识别学习 day04(目标检测的基础概念)

经典的目标检测方法 one-stage 单阶段法:YOLO系列、SSD系列 one-stage方法:仅预测一次,直接在特征图上预测每个物体的类别和边界框输入图像之后,使用CNN网络提取特征图,不加入任何补充(锚点、锚框&#x…

Kafka 架构深入介绍 及搭建Filebeat+Kafka+ELK

目录 一 架构深入介绍 (一)Kafka 工作流程及文件存储机制 (二)数据可靠性保证 (三)数据一致性问题 (四)故障问题 (五)ack 应答机制 二 实…

蓝桥杯2024年第十五届省赛

E:宝石组合 根据给的公式化简后变为gcd(a,b,c)根据算数基本定理&#xff0c;推一下就可以了 然后我们对1到mx的树求约数&#xff0c;并记录约数的次数&#xff0c;我们选择一个最大的且次数大于等3的就是gcd int mx; vector<int> g[N]; vector<int> cnt[N]; int…

基于贝叶斯算法的机器学习在自动驾驶路径规划中的应用实例

目录 第一章 引言 第二章 数据准备 第三章 贝叶斯路径规划模型训练 第四章 路径规划预测 第五章 路径执行 第六章 实验结果分析 第一章 引言 自动驾驶技术的发展带来了自动驾驶车辆的出现&#xff0c;而路径规划作为自动驾驶车辆的关键功能之一&#xff0c;对于确定最佳行…

JVM之JVM栈的详细解析

Java 栈 Java 虚拟机栈&#xff1a;Java Virtual Machine Stacks&#xff0c;每个线程运行时所需要的内存 每个方法被执行时&#xff0c;都会在虚拟机栈中创建一个栈帧 stack frame&#xff08;一个方法一个栈帧&#xff09; Java 虚拟机规范允许 Java 栈的大小是动态的或者是…

标准版uni-app移动端页面添加/开发操作流程

页面简介 uni-app项目中&#xff0c;一个页面就是一个符合Vue SFC规范的.vue文件或.nvue文件。 .vue页面和.nvue页面&#xff0c;均全平台支持&#xff0c;差异在于当uni-app发行到App平台时&#xff0c;.vue文件会使用webview进行渲染&#xff0c;.nvue会使用原生进行渲染。…

用海豚调度器定时调度从Kafka到HDFS的kettle任务脚本

在实际项目中&#xff0c;从Kafka到HDFS的数据是每天自动生成一个文件&#xff0c;按日期区分。而且Kafka在不断生产数据&#xff0c;因此看看kettle是不是需要时刻运行&#xff1f;能不能按照每日自动生成数据文件&#xff1f; 为了测试实际项目中的海豚定时调度从Kafka到HDF…

ActiveMQ主从架构和集群架构的介绍及搭建

一、主从和集群架构的特点 1.1 主从架构的-Master/slave模式特点 读写分离&#xff0c;纵向扩展&#xff0c;所有的写操作一般在master上完成&#xff0c;slave只提供一个热备 1.2 集群架构-Cluster模式特点 分布式的一种存储&#xff0c;水平的扩展&#xff0c;消息的分布…

CCleaner怎么清理软件缓存 CCleaner清理要勾选哪些 ccleanerfree下载

CCleaner软件是一款优秀的数据清理软件&#xff0c;其中没有硬盘和内存的设置&#xff0c;也不含任何广告软件&#xff0c;其出色的注册表清洁功能能够保证您的电脑更稳定运行。本文将围绕CCleaner怎么清理软件缓存&#xff0c;CCleaner清理要勾选哪些的相关内容进行介绍。 一、…

计算机网络——DNS协议

目录 前言 前篇 引言 IP地址与域名 DNS协议的工作流程 DNS服务器节点之间是如何维护上下级关系的 前言 本博客是博主用于复习计算机网络的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结&#xff0c;讲的非…

将本地项目上传到Github

首先安装git、创建github账号 1、创建一个新的仓库 2、创建SSH KEY。先看一下你C盘用户目录下有没有.ssh目录&#xff0c;有的话看下里面有没有id_rsa和id_rsa.pub这两个文件&#xff0c;有就跳到下一步&#xff0c;没有就通过下面命令创建。 ssh-keygen -t rsa -C "you…

面试算法-174-二叉树的层序遍历

题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 解 class Solut…