Opencv(图像处理)-基于Python-图像的基本运算-给图片加水印

简介: Opencv(图像处理)-基于Python-图像的基本运算-给图片加水印

1. 图像运算概念

在计算机的世界里,图像由一个个像素点组成,每个像素点代表一个数字,并且数字的大小代表像素点的颜色,所有像素点的颜色组成了一个图像。因此,使用矩阵可以很好的表示图像。

OpenCV提供的运算方法就是基于矩阵的运算。

2. 图像运算

2.1 add()

将两张图片相加(矩阵的各个像素点分别对应相加)

result = cv2.add(img1,img2)

参数:两张大小完全相同的图片。

返回值计算过后的图片(深拷贝)


把lina图4的左上角部分截取了在图1中,然后与girl图2相加,得到如图3的结果

2.2 substract()

将两个图片做差(矩阵的各个像素点分别对应相减)

result = cv2.subtract(img1,img2)

参数:img1-img2

结果保存在一个新参数中(深拷贝)

图像1和2作差后,亮度降低

部分代码示例:

import cv2
import numpy as np
img1 = cv2.imread('./image/girl.png')
img2 = cv2.imread('./image/lina.jpg')
# 打印两个图片的参数
print(img1.shape)
print(img2.shape)
# 创建像素点为1的矩阵,并且每个像素点都乘50
img3 = np.ones((185, 185, 3), np.uint8)*100
# img2过大,我们截取部分图像,让region与img1一样大
# 截取为深拷贝,对截取的图像运算,并不改变原图像
region = img2[0:185, 0:185]
# 将两个图像运算
result = cv2.add(img1, region)
# 降低图片的亮度
low_light_result = cv2.subtract(result, img3)
# 展示图片
# cv2.imshow("img1", img1)
# cv2.imshow("img2", img2)
# cv2.imshow("region", region)
cv2.imshow('result', result)
cv2.imshow('img3', img3)
cv2.imshow('low_light_result', low_light_result)
cv2.waitKey(0)

2.3 multiply()/divide()

矩阵乘法(将两个矩阵各个像素点分别相乘)

result = cv2.multiply(img1,img2)

矩阵除法(将两个矩阵的各个像素点分别相除)

result = cv2.divide()

2.4 addWeighted()

图像融合,按权重相加

result = cv2.addWeighted(A,alpha,B,bate,gamma)

参数:alpha:A的权重;bate:B的权重;gamma:静态权重(运算完以后再加gamma)

将图1按0.2,图2按0.8的权重相加得到图3

部分代码展示

import cv2
import numpy as np
img1 = cv2.imread('./image/girl.png')
img2 = cv2.imread('./image/lina.jpg')
# 打印两个图片的参数
print(img1.shape)
print(img2.shape)
# img2过大,我们截取部分图像,让region与img1一样大
# 截取为深拷贝,对截取的图像运算,并不改变原图像
region = img2[0:185, 0:185]
# 展示图片
cv2.imshow("img1", img1)
cv2.imshow("region", region)
# 图像融合
result = cv2.addWeighted(region, 0.2, img1, 0.8, 0)
cv2.imshow('result', result)
cv2.waitKey(0)

2.5 与/或/非

这里的逻辑运算和我们熟知的其他语言的逻辑运算是一致的。是将矩阵的各个像素点分别进行逻辑运算。

bitwise_and()

图像的按位与运算

result = cv2.bitwise_and(img1,img2)

bitwise_or()

图像的按位或运算

result = cv2.bitwise_or(img1,img2)

bitwise_not()

图像的非运算

result = cv2.bitwise_not(img)

bitwise_xor

图像的按位异或运算(相同为0,相异为1)

result = cv2.bitwise_xor(img1,img2)

部分代码展示

import cv2
import numpy as np
# 创建一个全0图像
img1 = np.zeros((400, 400, 3), np.uint8)
img2 = np.zeros((400, 400, 3), np.uint8)
# 将两幅图部分变成白色
img1[100:200, 100:200] = [255, 255, 255]
img2[150:250, 150:250] = [255, 255, 255]
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
# 位运算
img_and = cv2.bitwise_and(img1, img2)
cv2.imshow('img_and', img_and)
img_or = cv2.bitwise_or(img1, img2)
cv2.imshow('img_or', img_or)
img_not = cv2.bitwise_not(img1)
cv2.imshow('img_not', img_not)
img_xor = cv2.bitwise_xor(img1, img2)
cv2.imshow('img_xor', img_xor)
cv2.waitKey(0)

代码结果如下所示:

3.给一幅图像添加水印

下面将展示给图片添加水印的大致步骤:

  1. 引入一幅图片lina
  2. 要准备一个logo,自己创建
  3. 计算在图片的什么地方添加,把添加的地方变成黑色
  4. 利用add,将logo与图片叠加在一起
import cv2
import numpy as np
img = cv2.imread('./image/lina.jpg')
col, row, chanles = img.shape
# 创建logo
logo = np.zeros((80, 80, 3), np.uint8)
mask1 = np.zeros((80, 80), np.uint8)# 只有一通道,是灰度图
# 画logo
logo[10:40, 10:40] = [0, 0, 255]
logo[30:70, 30:70] = [0, 255, 0]
# 为了将图片中的部分截取下来,把logo的地方给弄黑
mask1[10:40, 10:40] = 255
mask1[30:70, 30:70] = 255
mask1 = cv2.bitwise_not(mask1)
# 截取图像部分
region_img = img[0:80, 0:80]
# 单通道图像与三通道图像运算,智能这样运算。
mask1 = cv2.bitwise_and(region_img, region_img, mask = mask1)
finish_logo = cv2.add(logo, mask1)
# 将处理好的mask1与原图像赋值(添加成功)
img[0:80, 0:80] = finish_logo
cv2.imshow('img', img)
# cv2.imshow('logo', logo)
# cv2.imshow('mask1', mask1)
# cv2.imshow('fin_logo',finish_logo)
cv2.waitKey(0)



以上就是关于图像运算的基本API,难免会有解释不清的地方,有问题欢迎在评论区讨论。

目录
相关文章
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
1085 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
282 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
7月前
|
机器学习/深度学习 编解码 Python
Python图片上采样工具 - RealESRGANer
Real-ESRGAN基于深度学习实现图像超分辨率放大,有效改善传统PIL缩放的模糊问题。支持多种模型版本,推荐使用魔搭社区提供的预训练模型,适用于将小图高质量放大至大图,放大倍率越低效果越佳。
539 3
|
7月前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
1822 0
|
11月前
|
数据采集 Web App开发 JavaScript
基于Selenium的Python爬虫抓取动态App图片
基于Selenium的Python爬虫抓取动态App图片
816 68
|
Python
Python实用记录(六):如何打开txt文档并删除指定绝对路径下图片
这篇文章介绍了如何使用Python打开txt文档,删除文档中指定路径的图片,并提供了一段示例代码来展示这一过程。
264 1
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
1002 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
4282 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
9月前
|
数据采集 存储 监控
Python爬虫实战:批量下载亚马逊商品图片
Python爬虫实战:批量下载亚马逊商品图片
|
11月前
|
存储 机器学习/深度学习 人工智能
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
本文探讨了多模态RAG系统的最优实现方案,通过模态特定处理与后期融合技术,在性能、准确性和复杂度间达成平衡。系统包含文档分割、内容提取、HTML转换、语义分块及向量化存储五大模块,有效保留结构和关系信息。相比传统方法,该方案显著提升了复杂查询的检索精度(+23%),并支持灵活升级。文章还介绍了查询处理机制与优势对比,为构建高效多模态RAG系统提供了实践指导。
2607 0
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本