当前位置: 首页 > java >正文

机器视觉学习-day10-图像添加水印

代码运行步骤:

运行的结果是在源图像上添加一个模板输入图像的前景

1 模板输入

此组件的功能是输入一个水印图片,需要进行灰度化与二值化,还需要制作掩膜。

模板图建议使用包含透明图层的png格式,png格式支持Alpha通道(透明度),jpg不支持此通道,但是OpenCV默认读取图片是BGR三通道,因此会减少png的Alpha通道,结果就是黑色。建议使用带透明的png图片作为水印。

2 与运算

有了二值化之后的模板输入图,就可以在原始图像中根据模板大小切割出一个ROI区域,即要添加水印的区域,让二值化之后的模板与原图切割出的ROI区域进行与运算。

3 图像融合

该组件的目的是将图像对应的位置像素进行叠加,需要注意的是两个像素数组的大小应该是相同的,另外还需要通道数相同。

原始图片:2.jpg

模板图像:1.png

import cv2if __name__ == '__main__':# 1. 图片输入path = '2.jpg'  # 读取名为"1.png"的主图像,存储到变量image_np中。image_np = cv2.imread(path)  # cv2.imread()函数读取图像文件,返回一个NumPy数组表示图像。# 2. 模板输入logo = cv2.imread('1.png')  # 读取名为"dog.png"的logo图像,存储到变量logo中。# 3.灰度化gray_logo = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)"""将彩色logo图像转换为灰度图像。cv2.cvtColor()函数用于颜色空间转换,这里将BGR格式转换为灰度格式。"""# 4.二值化ret, mask_logo = cv2.threshold(gray_logo,1,255,cv2.THRESH_BINARY_INV  # 反阈值)"""对灰度logo图像进行二值化处理,生成掩膜(mask)。cv2.threshold()函数应用阈值处理:第一个参数gray_logo是输入图像第二个参数1是阈值,这里设为1第三个参数255是最大值第四个参数cv2.THRESH_BINARY_INV表示使用反向二值化反向二值化(# 反阈值)意味着:像素值大于1的变为0(黑色),小于等于1的变为255(白色)"""# 5. 与运算rows, cols = logo.shape[:2]  # 获取logo图像的尺寸(高度和宽度)# logo.shape返回一个元组(高度, 宽度, 通道数),[:2]只取前两个值print(rows, cols)# 从原图中做ROI切割roi = image_np[:rows, :cols]# 从主图像中提取与logo相同大小的区域(ROI - Region of Interest)# image_np[:rows, :cols]使用数组切片获取左上角区域cv2.imshow('roi', roi)  # 显示ROI区域cv2.imwrite('roi.jpg', roi)  # 切割的图像# 位于操作需要传两个原图,之前的实验遇见过# mask_logo在位于操作中充当掩膜的角色image_np_bg = cv2.bitwise_and(roi,roi,mask=mask_logo)cv2.imshow('image_np_bg', image_np_bg)cv2.imwrite('image_np_bg.jpg', image_np_bg)  # 掩膜"""cv2.bitwise_and()执行按位与操作:前两个参数是相同的输入图像(roi)mask=mask_logo指定掩膜,只有在掩膜非零的区域才会进行与操作这步操作的目的是在ROI中保留logo背景区域(掩膜中白色部分)"""# 6. 图像融合dst = cv2.add(image_np_bg, logo)  # dst是小图融合后的结果,需要把像素值替换到原大图中"""将处理后的ROI背景与logo图像相加融合cv2.add()执行图像加法,将两个图像的像素值相加由于image_np_bg中logo区域是黑色(值为0),加上logo后,logo区域就显示出来了"""image_np[:rows, :cols] = dst# 将融合后的结果替换回原图像的相应位置# 7. 图片输出cv2.imshow('image_np', image_np)cv2.waitKey(0)cv2.imwrite('image_np.png', image_np)"""
整体逻辑:读取主图像和logo图像将logo转换为灰度图像并创建反向二值化掩膜从主图像中提取与logo相同大小的ROI区域使用掩膜在ROI区域中保留背景部分将处理后的ROI背景与logo图像相加融合将融合结果放回主图像的原始位置显示最终结果这种方法确保了logo能够自然地叠加到主图像上,同时保持了主图像背景在logo透明区域的可见性。
"""

ROI切割图像:roi.jpg

掩膜图像:image_np_bg.jpg

最后得到的图像:

    http://www.xdnf.cn/news/18982.html

    相关文章:

  • Mybatis 与 Springboot 集成过程详解
  • Kubernetes一EFK日志架构
  • Ovis2.5技术解密:原生分辨率与“反思模式”如何铸就新一代MLLM王者
  • 嵌入式学习日志————实验:串口发送串口发送+接收
  • 2025年渗透测试面试题总结-37(题目+回答)
  • 2024年06月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 零基础-力扣100题从易到难详解(持续更新1-10题)
  • 【链表 - LeetCode】25. K 个一组翻转链表
  • DAY 58 经典时序预测模型2
  • Kubernetes 的20 个核心命令分类详解
  • Linex系统网络管理(二)
  • 数据结构第8章 排序(竟成)
  • SqlHelper类库的使用方法
  • .NET周刊【8月第3期 2025-08-17】
  • 鸿蒙ArkUI 基础篇-06-组件基础语法-Column/Row/Text
  • 车载诊断架构 --- 基于整车功能的正向诊断需求开发
  • Dubbo加标签方式
  • Vue3 + 高德地图实现车辆电子围栏监控与报警
  • banner这个文件是怎么请求到后端数据的
  • codeforces(1045)(div2)D. Sliding Tree
  • zookeeper-集群扩缩容
  • 二次校验请求源 IP 是否在 WAF 官方 IP 段内” + “校验是否携带 WAF 专属 HTTP 头
  • 全域管控,一触可达:复合机器人远程监控方案重塑智能制造
  • volitale伪共享问题及解决方案
  • 高效管理远程连接!Remote Desktop Manager 全方位使用指南
  • 对接连连支付(四)-- 收款查询
  • 数据结构:单链表的应用(力扣算法题)第一章
  • 迅睿CMS自定义网站表单:HTML方式调用Select下拉选项数据指南
  • Winsock 操作指南
  • 宝塔面板零基础搭建 WordPress 个人博客与外贸网站 | 新手10分钟上手指南