cv2.drawContours(image, contours, contourIdx, color, thickness, lineType, hierarchy, maxLevel, offset)
cv2.drawContours()
函数用于在图像上绘制轮廓。参数说明:
image
:要绘制轮廓的图像。contours
:要绘制的轮廓列表。contourIdx
:要绘制的轮廓索引。设置为 -1 时表示绘制所有轮廓。color
:绘制轮廓的颜色。可以是单个值(灰度图像)或包含三个通道值的元组(彩色图像)。(灰度图只能用灰色图像,彩色图只能用彩色图像)thickness
:轮廓线的宽度。默认值为 1。lineType
:轮廓线的类型。默认值为 8(8 连接线)。hierarchy
:轮廓的层级信息。这是可选参数,一般不需要指定。maxLevel
:绘制轮廓的最大层级。这是可选参数,一般不需要指定。offset
:可选偏移量,用于调整轮廓坐标。这是可选参数,一般不需要指定。
在Python中,函数是一种可调用的对象,可以像其他对象一样被传递、赋值和引用。可以将函数赋值给变量,然后通过该变量调用函数。
例如 my_function
是一个函数,我们将它赋值给了变量func
。然后,我们可以通过func()
来调用这个函数。
def my_function():
print("Hello, world!")# 将函数赋值给变量
func = my_function# 通过变量调用函数
func() # 输出:Hello, world!
您还可以在类中定义方法,方法是与类相关联的函数。然后,可以实例化该类,并通过实例调用方法。定义了一个类
MyClass
,其中包含一个名为my_method
的方法。然后,我们创建了类的实例obj
,并通过obj.my_method()
调用了该方法。例如:
class MyClass:
def my_method(self):
print("Hello, world!")# 创建类的实例
obj = MyClass()# 调用实例方法
obj.my_method() # 输出:Hello, world!
contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
参数说明:
image
:输入的二值图像,通常为灰度图像或经过阈值处理后的图像。mode
:轮廓检索模式。指定轮廓的层次结构和检索方式。常见的模式有:
cv2.RETR_EXTERNAL
:只检测最外层的轮廓。cv2.RETR_LIST
:检测所有轮廓,不建立层次结构。cv2.RETR_CCOMP
:检测所有轮廓,并将其组织为两级层次结构。cv2.RETR_TREE
:检测所有轮廓,并完整地重建轮廓的层次结构。method
:轮廓逼近方法。指定轮廓的近似方式。常见的方法有:
cv2.CHAIN_APPROX_NONE
:存储所有的轮廓点。cv2.CHAIN_APPROX_SIMPLE
:压缩水平、垂直和对角线方向的轮廓,只保留端点。cv2.CHAIN_APPROX_TC89_L1
和cv2.CHAIN_APPROX_TC89_KCOS
:应用 Teh-Chin 链逼近算法。contours
(可选):检测到的轮廓结果。是一个列表,每个元素表示一个轮廓,每个轮廓由一系列点组成。hierarchy
(可选):轮廓的层次结构。是一个可选参数,用于描述轮廓之间的关系。offset
(可选):轮廓点的可选偏移量。返回值:
contours
:检测到的轮廓列表。hierarchy
:轮廓的层次结构。
ndarray
对象与numpy库的关系NumPy(Numerical Python)是一个用于科学计算的强大库,提供了高性能的多维数组对象(
ndarray
)以及处理这些数组的各种函数和方法。在 NumPy 中,ndarray
是最重要的数据结构,用于表示多维数组。
ndarray
是 NumPy 库中的一个类,它代表了一个多维数组对象。这个类提供了许多方法和函数,用于创建、操作和处理多维数组。ndarray
对象具有以下特点:
- 它是一个固定大小、可变数据类型的多维数组。
- 它支持矢量化操作,可以对整个数组进行高效的数值运算。
- 它提供了丰富的索引和切片操作,可以方便地访问和修改数组元素。
- 它可以存储各种类型的数据,如整数、浮点数、布尔值等。
NumPy 还提供了其他功能,如数学函数、线性代数运算、傅里叶变换等。这些功能通常是通过调用
ndarray
对象上的方法或使用 NumPy 的顶层函数来实现的。综上所述,
ndarray
对象是 NumPy 库中表示多维数组的主要数据结构,而 NumPy 是一个包含ndarray
对象和其他功能的库。
ndarray:(a,b,c)
三维数组,因为是三个字母,就代表三个维度
np.shape = (a,b,c)
a:代表深度,也就是几个平面
b:代表几行,也就是行数,也就是高
c:代表几列,也就是列数,也就是长或者宽
python列表追加
在Python中,可以使用
.append()
方法将一个元素追加到列表的末尾,或使用.extend()
方法将另一个列表中的所有元素追加到当前列表的末尾。
my_list = [1, 2, 3]
my_list.append(4)
print(my_list) # 输出: [1, 2, 3, 4]
my_list = [1, 2, 3]
another_list = [4, 5, 6]
my_list.extend(another_list)
print(my_list) # 输出: [1, 2, 3, 4, 5, 6]
python列表追加三维数组(
ndarray
)如果将
ndarray
对象(my_array
)直接传递给.extend()
方法,它将会将数组的第一维度视为一个可迭代对象,并将其追加为列表的元素。
import numpy as np
# 创建一个形状为 (6, 7, 8) 的三维数组
my_array = np.ones((6, 7, 8))# 创建一个空列表
my_list = []# 将三维数组的每一维度作为一个元素追加到 my_list 中
my_list.extend(my_array)# 打印 my_list
print(my_list)print(len(my_list))
运行上述代码,将会打印输出 my_list
的内容以及 my_list
的长度。
包含了六个形状为 (7, 8) 的二维数组
[array([[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.],
...,
[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.]]),
array([[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.],
...,
[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.]]),
...
array([[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.],
...,
[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.],
[1., 1., 1., ..., 1., 1., 1.]])]
6
np.array(list)
np.array(list)
是使用 NumPy 库中的array()
函数创建一个数组的常用方式。它将一个列表作为输入,并将其转换为一个 NumPy 数组。
x, y, width, height = cv2.boundingRect(contour)
参数说明:
contour
:表示输入的轮廓,可以是一个点集,也可以是一个形状为(N, 1, 2)
的 NumPy 数组,其中 N 是轮廓上的点数。返回值说明:
x
:返回边界矩形左上角点的 x 坐标。y
:返回边界矩形左上角点的 y 坐标。width
:返回边界矩形的宽度。height
:返回边界矩形的高度。边界矩形是一个水平或垂直的矩形,完全包围住给定的轮廓。该函数根据轮廓上的点的最小外接矩形来计算边界矩形。
cv2.boundingRect()
是 OpenCV 库中的一个函数,用于计算给定轮廓的边界矩形。
image = cv2.imdecode(np.fromfile(img_path[i], dtype=np.uint8), -1) label = cv2.imdecode(np.fromfile(label_path[i], dtype=np.uint8), cv2.IMREAD_GRAYSCALE) assert image.shape[:2] == label.shape[:2] if len(image.shape) == 3: gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) else: gray = image_, binary = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) contours = sorted(contours, key=lambda i: len(i), reverse=True) contour_total = [] for cnt in contours: contour_total.extend(cnt) x_top, y_top, w, h = cv2.boundingRect(np.array(contour_total)) img_crop = image[y_top:y_top+h, x_top:x_top+w].copy() label_crop = label[y_top:y_top+h, x_top:x_top+w].copy()
image[y_top:y_top+h, x_top:x_top+w]
这种切片操作对于彩色图像和灰度图像都适用。对于彩色图像,切片操作将返回一个包含指定区域的 BGR 通道像素值的子图像。
对于灰度图像,切片操作将返回一个包含指定区域的灰度像素值的子图像。
所以无论是彩色图像还是灰度图像,您都可以使用这种切片操作来提取感兴趣的区域。
对于图片来说,python中numpy库中的ndarray的格式是(行,列,通道数)
对于彩色图像,它通常由三个通道(B、G、R)组成,每个通道上的像素值表示图像在相应颜色通道上的强度。
因此,彩色图像在内存中由一个三维数组表示,其中第一个维度表示行数,第二个维度表示列数,第三个维度表示通道数。
对于灰度图像,它只有一个通道,每个像素值表示图像在灰度上的强度。灰度图像在内存中由一个二维数组表示,其中第一个维度表示行数,第二个维度表示列数。
resized_image = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
cv2.resize()
是 OpenCV 库中的函数,用于调整图像的大小。参数说明:
src
:原始图像,可以是彩色图像或灰度图像。dsize
:目标图像的大小,可以是指定为(width, height)
的元组,或者指定为整数的宽度和高度。dst
(可选):输出图像,可以选择性地提供输出图像的参数。fx
(可选):在水平方向上的缩放因子。fy
(可选):在垂直方向上的缩放因子。interpolation
(可选):插值方法,用于调整图像大小。常用的插值方法包括:
cv2.INTER_NEAREST
:最近邻插值。cv2.INTER_LINEAR
:双线性插值(默认)。cv2.INTER_CUBIC
:双立方插值。cv2.INTER_AREA
:区域插值。cv2.INTER_LANCZOS4
:Lanczos插值。