pytorch加载数据集续

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插值。

你可能感兴趣的:(pytorch,python,python,pytorch)