创客出手

目录

OpenCV Python NumPy图像矩阵操作

本示例使用的OpenCV版本是:4.1.1
运行Python的编辑器:Jupyter notebook 6.0.0

示例目的

认识矩阵,
通过使用NumPy实现对矩阵的创建,和各种赋值操作。

最后,通过一些常用的操作,用图像形式表示矩阵,如下图。

file

实现代码

1,加载所需要用到的库

import cv2
import numpy as np
import matplotlib.pyplot as plt

2, 使用 np.full 创建矩阵,全矩阵同一个数值

# 使用 np.full 创建一个480x640的3通道矩阵,并且用255的值填充整个矩阵,
image = np.full((480, 640, 3), 255, np.uint8)

# plt.figure 定义一个图像窗口,大小为(9,9)
plt.figure(figsize = (9,9))
# 用plt.imshow显示该矩阵,将会见到一张全白色的图像。
plt.imshow(image)

注意 :figsize:以英寸为单位的宽高,缺省值为 rc figure.figsize (1英寸等于2.54厘米)。定义图像窗口大小目的是为了让图像显示得更大更清晰。

运行以上代码,会看到如下图像:

file

3, 使用 np.full 创建矩阵,指定某通道为同一个数值

# 用 np.full 创建一个矩阵,并指定第三通道为255,
# OpenCV处理图像的模式是BGR,所以第三通道是红色
image = np.full((480,640,3),(0,0,255),np.uint8)

# 由于 plt.imshow 显示图像的色彩空间是RGB
# 所以需要,通过色彩空间变换,把BGR转换成RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# plt.figure 定义一个图像窗口,大小为(9,9)
plt.figure(figsize = (9,9))
# 显示图像
plt.imshow(image)

运行以上代码,会看到一张红色的图像,如下:

file

4, ndarray数据类型.fill,以某值填充

# 该.fill函数可以直接使用其参数0,填充整个矩阵
image.fill(0)

# plt.figure 定义一个图像窗口,大小为(9,9)
plt.figure(figsize = (9,9))
# 显示图像
plt.imshow(image)

运行以上代码,会看到一张黑色的图像,如下:

file

5, ndarray数据类型指定元素赋值 (一)

# 指定image的矩阵中,索引为[240, 160],[240, 320],[240, 480]的这三个元素的值都是(255,255,255)
image[240, 160] = image[240, 320] = image[240, 480] = (255, 255, 255)

plt.figure(figsize = (9,9))
plt.imshow(image)

运行以上代码,仔细查看图片,会有3个白点,正正就是[240, 160],[240, 320]这三个坐标,如下:

file

6, ndarray数据类型指定元素赋值 (二)

# 设置矩阵的第一个通道全为255
image[:, :, 0] = 255

plt.figure(figsize = (9,9))
plt.imshow(image)

运行以上代码,根据RGB的模式,第一个通道是255,那么会看到一张红色的图片,如下:

file

注意:仔细查看还是可以看到3个白点的。

7,ndarray数据类型指定元素赋值 (三)

# 将图像中间垂直线上的像素设置为白色
image[:, 320, :] = 255

plt.figure(figsize = (9,9))
plt.imshow(image)

运行以上代码,将会看到一张红色图片中间有一条垂直的白线,如下:

file

8,ndarray数据类型指定元素赋值 (三)

在指定区域中,指定的通道中赋值

# 区域100:600, 100:200,通道索引为2的值为255
# (通道索引2,在RGB中也就是B的这个通道,红色 + 蓝色 = 紫红色)
image[100:600, 100:200, 2] = 255

plt.figure(figsize = (9,9))
plt.imshow(image)

运行以上代码,将会看到图片中间有一部分的紫红色,如下:

file

程序说明

OpenCV的矩阵,在Python中是用NumPy表示的。

NumPy提供了强大而简洁的方法函数来处理多位矩阵,也称之为张量。在使用Pytorch深度学习的框架是,NumPy的数据类型也可以非常方便地转换成Pytorch张量交给GPU处理数据。在本教程中,我们使用了很多np的函数方法去处理矩阵,因为NumPy支持高端大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

  • 这介绍一下图像矩阵的维数和类型。图像矩阵有两个特征——形状类型和元素数据类型。
  1. 形状:宽度(列数),高度(行数)和通道数。
    在OpenCV中使用全彩或者灰度的矩阵。全彩为3通道(红Red,绿Green,蓝Blue),灰度则只有1通道。在OpenCV中由于历史遗留问题,是使用BGR的,所以通过cv.imread读取的图像会是BGR模式,而plt.imshow使用的的是RGB模式,所以在很多时候,会发现使用plt.imshow显示的图像颜色怪怪的,而使用cv.imshow则正常的主要原因。
  2. 元素数据类型:一般分为np.unit8, np.unit64, np.float32,在本教程中使用的是数值范围在0-255的np.unit8。
  • np.full 用于创建矩阵

  • np.fill 用于填充相同的值

  • 访问矩阵中某个元素的值,可以通过

    1. 例如image[240,160]访问该元素,将会返回(255,255,255)的数组
    2. 例如image[240,160,1]访问该元素的索引值为1的数据(也可以理解成该元素的第二通道),将会返回255的数组
  • 在索引中使用:号,助于指定矩阵中的某些区域:

    1. 例如image[:,160],指所有的x和y为160的区域
    2. 例如image[120:140,160],指x为120至140,和y为160的区域
更多关于 的文章
关注创客出手公众号

关注创客出手