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实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
1373 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
426 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
计算机视觉 Python
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
这篇博客介绍了如何使用OpenCV库在Python中将图片保存到指定目录,以及如何将文件夹中的所有图片读取并以数组形式输出。
1258 0
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
577 0
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
1337 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
4992 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
981 10
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
509 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
机器学习/深度学习 存储 数据挖掘
Python 编程入门:理解变量、数据类型和基本运算
【10月更文挑战第43天】在编程的海洋中,Python是一艘易于驾驭的小船。本文将带你启航,探索Python编程的基础:变量的声明与使用、丰富的数据类型以及如何通过基本运算符来操作它们。我们将从浅显易懂的例子出发,逐步深入到代码示例,确保即使是零基础的读者也能跟上步伐。准备好了吗?让我们开始吧!
365 0

推荐镜像

更多