【菜狗学编程】opencv、numpy简单基础——20251011
1. Numpy基础知识
1.1 Numpy简介
Numpy是科学计算的基础包,提供了一个多维数组对象(ndarray)。其核心是ndarray对象,用于处理相同数据类型的n维数组。Numpy是Python中进行数值计算的强大工具,广泛应用于数据分析、机器学习等领域。
Numpy与Python列表的区别:
大小:Numpy数组在创建时有固定的大小,而Python列表可以动态调整大小。
数据类型:Numpy数组中的元素必须是相同的数据类型,而Python列表可以包含不同类型的元素。
运算性能:Numpy能够高效地对大量数据进行数学运算,速度远快于Python列表。
1.2 Numpy基本概念
轴(Axis):指数组的维度。例如,二维数组的行和列分别是不同的轴。
秩(Rank):指数组的轴的个数。一个二维数组的秩为2。
ndarray对象:Numpy的核心数据结构,代表n维数组。
常用ndarray属性:
ndarray.ndim:数组的维度数。ndarray.shape:数组的形状(例如,二维数组的形状为(行数, 列数))。ndarray.size:数组中元素的总数。ndarray.dtype:数组元素的数据类型。ndarray.itemsize:数组中每个元素的字节大小。ndarray.data:数组元素的缓冲区。
1.3 创建数组
使用
np.array()从Python列表或元组创建数组。b = np.array([2, 3, 4])np.zeros():创建一个元素全为0的数组。np.zeros((3, 4))np.ones():创建一个元素全为1的数组。np.ones((2, 3, 4), dtype=np.int16)np.arange():创建一个按给定步长的数组。np.arange(10, 30, 5) # 生成包含10, 15, 20, 25的数组np.linspace():生成指定区间内的均匀分布的数组。np.linspace(0, 2, 9) # 生成从0到2的9个数
1.4 基本运算
*:元素逐一相乘(对应位置的元素相乘)。np.dot():矩阵乘法,行与列相乘。
np.random.rand(2, 2) # 生成一个服从均匀分布的数组
np.random.randn(2, 2) # 生成一个服从标准正态分布的数组常用操作:
a.sum():对数组所有元素求和。a.min():找最小值。a.max():找最大值。b.sum(axis=0):按列求和。b.cumsum(axis=1):按行计算累计和。
1.5 索引、切片与迭代
索引:直接通过索引操作访问数组元素。
a = np.arange(10)**3
a[:6:2] = 50 # 每隔一个元素赋值为50
a[::-1] # 反转数组
- 切片:使用
i = np.array([1, 1, 3, 8, 5]),通过数组索引访问元素。
a[i]
- 迭代:使用
np.frompyfunc()将Python函数转化为矢量化函数。
def func(x, y): return x + y
np.frompyfunc(func, 2, 1) # 变为矢量化函数
1.6 更改数组形状
a.shape:获取数组的形状。a.ravel():返回一维数组。a.reshape(3, -1):将数组重塑为3行,列数自动推断。a.T:返回数组的转置。
1.7 数组的组合与拆分
np.hstack():按水平方向(列方向)组合数组。np.vstack():按垂直方向(行方向)组合数组。np.column_stack():将多个一维数组按列对齐组合为二维数组。
np.column_stack((a, b))
np.hsplit(a, 3) # 沿水平方向切分
np.vsplit(a, 3) # 沿垂直方向切分
numpy中np.diff(series)计算数组中相邻元素之间的差分。它支持多次差分计算以及沿指定轴进行操作。
import numpy as np# 一维数组差分
arr = np.array([1, 3, 10])
result = np.diff(arr)
print(result) # 输出: [2 7]# 二维数组沿不同轴差分
arr_2d = np.array([[1, 3, 6], [4, 9, 15]])
result_axis0 = np.diff(arr_2d, axis=0)
result_axis1 = np.diff(arr_2d, axis=1)
print(result_axis0) # 输出: [[3 6 9]]
print(result_axis1) # 输出: [[2 3] [5 6]]2. Pandas的DataFrame
2.1 DataFrame简介
Pandas的DataFrame是一个二维标签数据结构,可以看作是一个表格。它的每一行和每一列都有标签,适合处理和分析结构化数据。
2.2 DataFrame常用操作
文件读写、查看信息、条件索引
df = pd.read_csv('file.csv') # 读取csv文件
df.to_csv('output.csv') # 输出为csv文件
df.info() # 查看DataFrame的信息
df.loc[df['column'] > 10] # 过滤出符合条件的行
3. OpenCV基础
3.1 图像导入与显示
导入OpenCV库并加载图像:
import cv2
image = cv2.imread('image.jpg')
cv2.imshow('Window', image) # 显示图像
cv2.waitKey(0) # 等待按键
3.2 图像处理
图像裁剪:
crop = image[10:170, 40:200] # 裁剪图像
- 绘制图形:
cv2.line(image, (100, 200), (250, 250), (250, 0, 0), 2) # 画线
cv2.rectangle(image, (30, 100), (60, 150), (0, 255, 0), 2) # 画矩形
cv2.circle(image, (150, 100), 20, (0, 0, 255), 3) # 画圆
cv2.putText(image, "hello", (100, 50), 0, 1, (255, 255, 255), 2, 1) # 添加文本
3.3 均值滤波与高斯滤波
使用高斯滤波器:
gauss = cv2.GaussianBlur(image, (5, 5), 0)- 使用均值滤波器:
median = cv2.medianBlur(image, 5)3.4 特征提取
转换为灰度图:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
- 获取特征点:
corners = cv2.goodFeaturesToTrack(gray, 500, 0.1, 10)
for corner in corners:x, y = corner.ravel()cv2.circle(image, (int(x), int(y)), 3, (255, 0, 255), -1)
3.5 模板匹配
查找图像中的菱形:
template = gray[75:105, 235:265]
match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
locations = np.where(match >= 0.9)
pytorch一些知识点
os.listdir()用于列出指定路径下的所有文件和文件夹名称。
返回一个包含指定目录下所有文件和文件夹名称的列表(list)。
PIL.Image.open(renders_dir / fname) 用 PIL.Image.open() 打开 renders_dir 目录下的 fname 文件。
tf.to_tensor(render)将render图像对象转换为tensor张量。
.unsqueeze(0)[:, :3, :, :] 在第 0 维增加一个 batch 维度,符合 PyTorch 神经网络输入格式,即批量维度 B × C × H × W。确保第二维度通道channel只取RGB三个通道。
sorted(...)对文件名进行排序(确保按照顺序读取深度图像)
torch.gradient(tensor, dim=N) 计算 tensor 在第 dim=N 维度上的梯度。dim=1 表示 x 方向(水平)梯度 dx。dim=0 表示 y 方向(垂直)梯度 dy。
-torch.ones_like(dx[0]) 生成一个与 dx[0] 形状相同的全 -1 Tensor,表示 Z 方向的分量。
torch.stack(..., dim=0) 将三个通道堆叠起来,形成 (3, H, W) 形状的 normal_map,每个像素点包含 (dx, dy, -1) 三个分量。
torch.norm(normal_map, dim=-1, keepdim=True)
沿着最后一维度dim=-1,对于normal_map计算二范数norm
normal_map / norm
from pathlib import Path# 假设 scene_dir 是某个场景的目录路径
scene_dir = '/path/to/scene'
scene_path = Path(scene_dir)Path就是这个的路径。
zip()将序列打包成一个元组序列。
torch.median()计算输入张量的中位数。
"{:>12.7f}".format(value){}:占位符::格式说明符的起始>:右对齐12:总宽度(包括小数点和小数部分).7f:保留 7 位小数的浮点数
——小狗照亮每一天
20251011
