使用OpenCV实现图像覆盖

重磅干货,第一时间送达

每张图像都包括RGB三个通道,分别代表红色、绿色和蓝色,使用它们来定义图像中任意一点的像素值,红绿蓝的值在0-255之间。
例如:一个像素值[255,0,0]代表全部为红色,像素值[255,255,0]是红色和绿色的混合,将显示为黄色。
但是,如果使用OpenCV读取图像,它将以BGR格式生成图像,那么[255,0,0]将代表蓝色。

使用OpenCV读取一张图像

任何图像都可以通过OpenCV使用命令读取。不过,OpenCV不支持HEIC格式的图像,所以不得不使用其它类型的库,如Pillow来读取HEIC类型的图像(或者先将它们转换为JPEG格式)
import cv2image = cv2.imread(‘image.jpg’)

当读取图像之后,如果有必要的话可以将其从BGR格式转换为RGB格式,通过使用cv2.cvtColor()命令实现。

image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

覆盖

图像可以看作是是一堆像素值以类似矩阵的格式存储。任何像素的值都可以独立于其他像素进行更改。这里有一张图像,使用OpenCV读取图像:

image_1

image_1 = cv2.imread(‘image_1.jpg’)print(image_1)
这里将给出矩阵形式的一系列像素值
array([[[107, 108, 106],[107, 108, 106],[107, 108, 106],…,[ 77, 78, 76],[ 77, 78, 76],[ 76, 77, 75]],…,[[ 93, 88, 87],[ 93, 88, 87],[ 92, 87, 86],…,[ 52, 62, 62],[ 52, 62, 62],[ 52, 62, 62]]], dtype=uint8)

如果只改变图像某一区域的像素值,比如更改为[0,0,0],这部分区域将变成黑色,因为这是颜色为黑色的像素值。同样,如果将像素值更改为[255,0,0],则该区域将变为蓝色(OpenCV以BGR格式读取图像)。

image_1[50: 100, 50:100] = [255, 0, 0]
同样,这些像素值可以被另一幅图像替换,只需通过使用该图像的像素值。
为了做到这一点,我们需要将覆盖图像修改为要替换的像素值的大小。可以通过使用函数来实现
image_2 = cv2.imread(‘image_2.jpg’)resized_image_2 = cv2.resize(image_2, dsize=(100, 100))
其中,代表图像要被修改的尺寸。
现在,可以将第二张图像够覆盖在第一张图片的上面
image_1[50:150, 50:150] = resized_image_2

覆盖PNG图像

与JPEG图像不同,PNG图像有第四个通道,它定义了给定像素的ALPHA(不透明度)。
除非另有规定,否则OpenCV以与JPEG图像相同的方式读取PNG图像。
为了读取带有Alpha值的PNG图像,我们需要在读取一张图像时指定标志现在,这个图像已经有了四个通道:BGRA
image_3 = cv2.imread(‘image_3.png’, cv2.IMREAD_UNCHANGED)print(image_3)array([[[0 0 0 0][0 0 0 0][0 0 0 0]…[0 0 0 0][0 0 0 0][0 0 0 0]]…[[0 0 0 0][0 0 0 0][0 0 0 0]…[0 0 0 0][0 0 0 0][0 0 0 0]]], dtype=uint8)
然而,这个图像有4个通道,但是我们的JPEG图像只有3个通道,所以这些值不能简单地替换。
我们需要在我们的JPEG图像中添加一个虚拟通道。
为此,我们将使用。可以使用命令安装它。
提供了一个函数来根据深度叠加值。
首先,我们需要一个与图像大小相同的虚拟数组。
为了创建虚拟通道,我们可以使用函数创建一个数组。
import numpy as npones = np.ones((image_1.shape[0], image_1.shape[1]))*255image_1 = np.dstack([image_1, ones])
我们将其数组与255相乘,因为alpha通道的值也存在于0-255之间。
现在,我们可以用PNG图像替换图像的像素值。
image_1[150:250, 150:250] = image_3
然而,它不会给出期望的结果,因为我们将alpha通道的值改为了零。
我们只需要替换那些具有非零值的像素值。为了做到这一点,我们可以通过检查每个像素值和替换非零值来强行执行,但这很耗时。
这里有一个更好的方法。我们可以获取要覆盖图像的alpha值。
alpha_image_3 = image_3[:, :, 3] / 255.0
我们将像素值除以255.0,以保持值在0-1之间。
和的alpha之和需要等于255。因此,我们可以创建另一个数组,其中包含和等于255的所需alpha值
alpha_image = 1 — alpha_image_3
现在,我们可以简单的取每个图像的alpha值和每个通道的图像像素值的元素乘积,并取它们的和。
for c in range(0, 3): image_1[150:250, 150:250, c] = ((alpha_image*image_1[150:250, 150:250, c]) + (alpha_image_3*image_3[:, :, c]))

交流群

(0)

相关推荐

  • 【AI基础】OpenCV,PIL,Skimage你pick谁

    汤兴旺 就读于吉林大学汽车工程学院,计算机视觉爱好者,言有三弟子 作者 | 汤兴旺 编辑 | 汤兴旺/言有三 如何对图像进行处理是深度学习图像处理的基础,我们常常需要对图像进行读取.保存.缩放.裁剪. ...

  • OpenCV-Python学习教程.4

    import cv2image = cv2.imread('./img/111.jpg')size = image.shapew = size[1] # 宽度h = size[0] # 高度s = s ...

  • 数字图像处理——opencv-python

    运行环境为jupyter notebook,已安装python,opencv-python(4.5.3.56) 一. 1.imread函数:读取数字图像 cv2.imread(path_of_imag ...

  • OpenCV探索之路(十三):详解掩膜mask

    在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 一开始我接触到Mask这个东西时,我还真是一头雾水啊,也对无法理解Mask到底有什么用.经过 ...

  • OpenCV入门教程(含人脸检测与常用图像处理示例等)

    在这篇文章中,我们将提供一些使用OpenCV的示例. 在OpenCV中混合图像 我们将提供一个逐步的示例,说明如何使用Python OpenCV混合图像.下面我们展示了目标图像和滤镜图像. 目标图像 ...

  • 如何使用OpenCV实现图像均衡???

    重磅干货,第一时间送达 我们已经练习了很多图像处理--操作图像(精确地说是图像矩阵).为此,我们探索了图像的均衡方法,以便在一定程度上增强对比度,以使被处理的图像看起来比原始图像更好,这种技术称为直方 ...

  • 基于Opencv的图像单应性转换实战

    重磅干货,第一时间送达 同形转换 我们所常见的都是以这样的方式来处理图像:检测斑点,分割感兴趣的对象等.我们如何将它们从一种形式转换为另一种形式来处理这些图像呢?通过单应矩阵快速转换图像可以实现这个需 ...

  • 使用OpenCV测量图像中物体之间的距离

    重磅干货,第一时间送达 本文转自:opencv学堂 本文来自光头哥哥的博客[Measuring distance between objects in an image with OpenCV],仅做 ...

  • 好玩的OpenCV:图像操作的基本知识(2)

    1.1随机生成像素 生成与test.jpg相同大小图片,但是像素是随机生成的. import numpy as np import cv2raw_image = cv2.imread('test图片路 ...

  • 基于OpenCV的图像翻转和镜像

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本期,我们将解释如何在Python中实现图像的镜像或翻转.大家只需 ...

  • 基于OpenCV的图像强度操作

    重磅干货,第一时间送达 01. 什么是图像强度操作 更改任何通道中的像素值 对图像的数学运算 亮度变化 对比度变化 伽玛操纵 直方图均衡 图像预处理中的滤波等增强 使用OpenCV加载图像 impor ...

  • 基于OpenCV的图像融合

    重磅干货,第一时间送达 本期我们将一起学习如何使用OpenCV的进行图像拼接. 01. 目录 python 入门 步骤1 -图像导入 步骤2-调整图像大小 步骤3-融合图像 步骤4-导出结果 02. ...

  • 基于OpenCV的图像阴影去除

    重磅干货,第一时间送达 我们经常需要通过扫描将纸上的全部内容转换为图像.有很多在线工具可以提高图像的亮度,或者消除图像中的阴影.但是我们可以手动删除阴影吗?当然可以,我们只需要将图像加载到相应的代码中 ...

  • 基于OpenCV的图像卡通化

    重磅干货,第一时间送达 本期将创建一个类似于Adobe Lightroom的Web应用程序,使用OpenCV和Streamlit实现图像的卡通化 作为一个狂热的街头摄影爱好者,几乎每个周末都要在城市中 ...