图像预处理-添加水印

一.ROI切割

        类似裁剪图片,但是原理是基于Numpy数组的切片操作(ROI数组切片是会修改原图数据的),也就是说这个“裁剪”不是为了保存“裁剪”部分,而是为了方便修改等处理。

import cv2 as cv
import numpy as npimg = cv.imread('../images/demo.png')# 前面是height,后面是width
roi = img[70:380, 81:450]cv.imshow('Original', img)
cv.imshow('ROI', roi)
cv.waitKey(0)
cv.destroyAllWindows()

二.图像添加水印

        也将一张图片中的某个物体或者图案提取出来,然后叠加到另一张图片上。通过将原始图片转换成灰度图,并进行二值化处理,得到一个类似掩膜的图像。

        简要来讲,就是得到一个目标区域大小的黑背景白logo掩膜(获取logo颜色),和一个白背景黑logo掩膜(获取背景颜色),然后两个分别对logo原图和目标区域进行与运算,然后处理后的两个图做饱和运算,就可以得到有颜色有背景的图了。

2.1 模板输入

        就是包含水印的图片,先灰度化后二值化(分别用阈值法和反向阈值法),这就得到了白色logo黑背景的掩膜和黑logo白色背景的掩膜。

import cv2 as cv
import numpy as npimg = cv.imread('../images/ymb3.jpg')# 进行灰度转化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 二值化(阈值法),后续获取原logo颜色
_, binary = cv.threshold(gray, 250, 255, cv.THRESH_BINARY)
# 二值化(反阈值法),后续获取目标区域背景色
_, binary_inv = cv.threshold(gray, 250, 255, cv.THRESH_BINARY_INV)# 显示图像
cv.imshow('binary', binary)
cv.imshow('binary_inv', binary_inv)
cv.waitKey(0)
cv.destroyAllWindows()

2.2 与运算

        根据掩膜的大小切割出一个ROI区域,也就是我们要添加水印的区域,之后让其与模板的两个掩膜进行运算,就可以得到有logo黑背景黑logo有目标区域背景的掩膜。

import cv2 as cv
import numpy as nplogo = cv.imread('../images/ymb3.jpg')
sy = cv.resize(logo, (150, 150))
img = cv.imread('../images/lvbo.png')# 进行灰度转化
gray = cv.cvtColor(sy, cv.COLOR_BGR2GRAY)# 二值化(阈值法),后续获取原logo颜色
_, binary = cv.threshold(gray, 250, 255, cv.THRESH_BINARY)
# 二值化(反阈值法),后续获取目标区域背景色
_, binary_inv = cv.threshold(gray, 250, 255, cv.THRESH_BINARY_INV)# ROI区域提取,先获取掩膜大小
print(binary.shape)
print(img.shape)# 从目标图想要加入水印的地方切片一个相同大小的区域
roi = img[100:250, 100:250]# 掩膜与目标图进行与运算,获取目标图中ROI区域的背景色
bg = cv.bitwise_and(roi, roi, mask=binary)# 掩膜与logo进行与运算,获取logo中的水印色
wm = cv.bitwise_and(sy, sy, mask=binary_inv)# 显示图像
cv.imshow('b', binary)
cv.imshow('bi', binary_inv)
cv.imshow('sy', sy)
cv.imshow('bg', bg)
cv.imshow('wm', wm)
cv.waitKey(0)
cv.destroyAllWindows()  

(150, 150)
(626, 1075, 3)

2.3 图像融合

目的就是将图像对应的数组中的对应元素进行相加

        就是opencv两张图相加,饱和运算就是加数值,黑色的区域是0,加5就是5,所以就可以替换黑色变成有颜色的部分。

        或者使用 OpenCV 的 cv.addWeighted() 方法可以将两张图片按权重进行混合。通过调整权重参数,可以控制水印的透明度。

# 合并logo水印与背景色
dst = cv.add(bg, wm)# 将融合图像插入目标图中
img[100:250, 100:250] = dst
cv.imshow('re', dst)
cv.imshow('result', img)
cv.waitKey(0)
cv.destroyAllWindows()

我这里是因为图片里面很多颜色像白色,所以效果没有特别好。

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

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

相关文章

数据结构——八大排序算法

排序在生活中应用很多,对数据排序有按成绩,商品价格,评论数量等标准来排序。 数据结构中有八大排序,插入、选择、快速、归并四类排序。 目录 插入排序 直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 hoare…

吃透LangChain(五):多模态输入与自定义输出

多模态数据输入 这里我们演示如何将多模态输入直接传递给模型。我们目前期望所有输入都以与OpenAl 期望的格式相同的格式传递。对于支持多模态输入的其他模型提供者,我们在类中添加了逻辑以转换为预期格式。 在这个例子中,我们将要求模型描述一幅图像。 …

【Rust 精进之路之第10篇-借用·规则】引用 (``, `mut`):安全、高效地访问数据

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:所有权的“限制”与“变通”之道 在上一篇【所有权核心】中,我们揭示了 Rust 如何通过所有权规则和移动 (Move) 语义来保证内存安全,避免了垃圾回收器的同时,也防止了诸…

剑指Offer(数据结构与算法面试题精讲)C++版——day16

剑指Offer(数据结构与算法面试题精讲)C版——day16 题目一:序列化和反序列化二叉树题目二:从根节点到叶节点的路径数字之和题目三:向下的路径节点值之和附录:源码gitee仓库 题目一:序列化和反序…

OpenCV 模板与多个对象匹配方法详解(继OpenCV 模板匹配方法详解)

文章目录 前言1.导入库2.图片预处理3.输出模板图片的宽和高4.模板匹配5.获取匹配结果中所有符合阈值的点的坐标5.1 threshold 0.9:5.2 loc np.where(res > threshold): 6.遍历所有匹配点6.1 loc 的结构回顾6.2 loc[::-1] 的作用6.2.1 为什么需要反转…

产品经理学习过程

一:扫盲篇(初始产品经理) 阶段1:了解产品经理 了解产品经理是做什么的、产品经理的分类、产品经理在实际工作中都会接触什么样的岗位、以及产品经理在实际工作中具体要做什么事情。 二:准备篇 阶段2:工…

【消息队列RocketMQ】一、RocketMQ入门核心概念与架构解析

在当今互联网技术飞速发展的时代,分布式系统的架构设计愈发复杂。消息队列作为分布式系统中重要的组件,在解耦应用、异步处理、削峰填谷等方面发挥着关键作用。RocketMQ 作为一款高性能、高可靠的分布式消息中间件,被广泛应用于各类互联网场景…

从“链主”到“全链”:供应链数字化转型的底层逻辑

1. 制造业与供应链数字化转型的必然性 1.1. 核心概念与战略重要性 制造业的数字化转型,是利用新一代数字技术(如工业互联网、人工智能、大数据、云计算、边缘计算等)对制造业的整体价值链进行根本性重塑的过程。这不仅涉及技术的应用&#…

x-ui重新申请ssl证书失败

由于某些需要我们重新申请ssl证书,x-ui自动化脚本不能强制更新,根据x-ui仓库源码: https://github.com/vaxilu/x-ui/blob/main/x-ui.sh 在申请ssl证书的地方稍作修改,得到,运行下面的脚本就可以重新申请ssl证书&#…

Java NIO Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接

什么是Java NIO? Java NIO(New Input/Output) 是Java 1.4(2002年)引入的一种非阻塞、面向缓冲区的输入输出框架,旨在提升Java在高性能和高并发场景下的I/O处理能力。它相比传统的 Java IO(java…

go环境安装mac

下载go安装包:https://golang.google.cn/dl/ 找到对应自己环境的版本下载。 注意有二进制的包,也有图形界面安装的包。图形界面直接傻瓜式点就行了。 二进制的按照下面操作: 1、下载二进制包。 2、将下载的二进制包解压至 /usr/local目录…

LVGL源码(9):学会控件的使用(自定义弹窗)

LVGL版本:8.3 LVGL的控件各式各样,每种控件都有自己的一些特性,当我们想要使用一个LVGL控件时,我们首先可以通过官网去了解控件的一些基本特性,官网链接如下: LVGL Basics — LVGL documentation&#xf…

《软件设计师》复习笔记(1)——考试介绍【新】

目录 一、考试介绍 证书价值 考试要求 二、【新】计算机与软件工程知识 三、软件设计 一、考试介绍 >考试科目>考题形式>考试时长>合格标准计算机与软件工程知识75道单选题(每题1分,总分75分)2023年11月改革机试后&#…

MCU中的BSS和data都占用SRAM空间吗?

在MCU中,BSS段和data段都占用SRAM空间,但它们的存储方式和用途有所不同。‌ BSS段 BSS段(Block Started by Symbol)用于存储未初始化的全局变量和静态变量。这些变量在程序启动时会被清零,因此它们不占用Flash空间&a…

Ubuntu 22.04 更换 Nvidia 显卡后启动无法进入桌面问题的解决

原显卡为 R7 240, 更换为 3060Ti 后, 开机进桌面时卡在了黑屏界面, 键盘有反应, 但是无法进入 shell. 解决方案为 https://askubuntu.com/questions/1538108/cant-install-rtx-4060-ti-on-ubuntu-22-04-lts 启动后在开机菜单中(如果没有开机菜单, 需要按shift键), 进入recove…

Python爬虫-爬取猫眼演出数据

前言 本文是该专栏的第53篇,后面会持续分享python爬虫干货知识,记得关注。 猫眼平台除了有影院信息之外,它还涵盖了演出信息,比如说“演唱会,音乐节,话剧音乐剧,脱口秀,音乐会,戏曲艺术,相声”等等各种演出相关信息。 而本文,笔者将以猫眼平台为例,基于Python爬虫…

人工智能-机器学习(线性回归,逻辑回归,聚类)

人工智能概述 人工智能分为:符号学习,机器学习。 机器学习是实现人工智能的一种方法,深度学习是实现机器学习的一种技术。 机器学习:使用算法来解析数据,从中学习,然后对真实世界中是事务进行决策和预测。如垃圾邮件检…

FPGA学习(五)——DDS信号发生器设计

FPGA学习(五)——DDS信号发生器设计 目录 FPGA学习(五)——DDS信号发生器设计一、FPGA开发中常用IP核——ROM/RAM/FIFO1、ROM简介2、ROM文件的设置(1)直接编辑法(2)用C语言等软件生成初始化文件 3、ROM IP核配置调用 二、DDS信号发…

【Vue】从 MVC 到 MVVM:前端架构演变与 Vue 的实践之路

个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–架构模式的演变背景​三–MVC:经典的分层起点​四–MVP:面向接口的解耦尝试​五–MVVM:数据驱动的终极形态​​六–Vue:MVVM 的现代化实践​​​ 二. 架构模…

【算法】快速排序、归并排序(非递归版)

目录 一、快速排序&#xff08;非递归&#xff09; 1.原理 2.实现 2.1 stack 2.2 partition(array,left,right) 2.3 pivot - 1 > left 二、归并排序&#xff08;非递归&#xff09; 1.原理 2.实现 2.1 gap 2.1.1 i 2*gap 2.1.2 gap * 2 2.1.3 gap < array.…