欢迎光临
我们一直在努力

Python机器视觉必备基础:Python基础语法+NumPy + Matplotlib

Python机器视觉必备基础:Python基础语法+NumPy + Matplotlib

这篇文章就是为零基础的小伙伴准备的,带你一步步掌握Python基础语法、NumPy数组和Matplotlib图像显示,为后面学习OpenCV打下坚实基础。

本文所有代码都可以直接复制运行,注释非常详细。 如果你还没有安装Python和所需库,请先参考我之前的文章完成安装。


一、Python基础速成

如果你是纯小白,建议先掌握以下几个最常用的语法(有编程基础的可以直接跳到NumPy部分)。

1. 变量与数据类型

Python中变量不需要声明类型,直接赋值即可。

# 整数
age = 25
# 浮点数
price = 9.99
# 字符串
name = "小明"
# 布尔值
is_ok = True

# 打印变量和类型
print(age, type(age)) # 25 <class 'int'>
print(price, type(price)) # 9.99 <class 'float'>
print(name, type(name)) # 小明 <class 'str'>
print(is_ok, type(is_ok)) # True <class 'bool'>

注释:# 是注释符号,后面的内容不会被执行。print() 是输出函数,type() 返回变量的数据类型。

2. 条件判断(if-elif-else)

score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好") # 这里会输出
else:
print("继续努力")

注意:Python用缩进(通常是4个空格)表示代码块,不要用Tab混用。

3. 循环

for循环(遍历列表)

fruits = ["苹果", "香蕉", "橘子"]
for fruit in fruits:
print(fruit)

while循环(条件控制)

count = 0
while count < 3:
print("当前计数:", count)
count += 1 # 不要忘记更新变量,否则会无限循环

4. 函数

使用 def 定义函数,可以返回值。

def add(a, b):
"""返回两个数的和""" # 这是文档字符串,解释函数功能
result = a + b
return result

# 调用函数
sum = add(3, 5)
print(sum) # 8

5. 列表推导式(重点)

一种快速生成列表的简洁写法,在数据处理中非常常用。

# 生成0~9每个数的平方
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 只取偶数的平方
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]

解释:range(10) 生成0到9的数字,x**2 是平方,if x % 2 == 0 是筛选条件。


二、NumPy基础:图像其实就是数组

NumPy(Numerical Python)是Python科学计算的核心库。OpenCV读取的每一张图片,在Python中都是一个NumPy数组(三维:高×宽×通道数)。

1. 导入NumPy

import numpy as np # 导入numpy库,并起个小名叫np(方便写代码)

解释:import 是导入命令,as np 是给库起别名,后面用 np.函数名 即可。

2. 创建数组

# 从列表创建一维数组
arr1 = np.array([1, 2, 3, 4])
print(arr1) # [1 2 3 4]

# 创建全0二维数组(3行4列)
zeros = np.zeros((3, 4))
print(zeros)
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]

# 创建全1三维数组(模拟一张2行3列3通道的图像)
ones = np.ones((2, 3, 3), dtype=np.uint8) # dtype指定数据类型,uint8表示0-255整数
print(ones.shape) # (2, 3, 3)

# 创建随机数组(0~1之间的均匀分布)
random_arr = np.random.rand(4, 4) # 4×4
print(random_arr)

# 创建随机整数数组(0~255之间)
rand_int = np.random.randint(0, 256, (3, 3))
print(rand_int)

3. 数组属性

# 模拟一张240×320的彩色图(高240,宽320,通道3)
arr = np.random.randint(0, 256, (240, 320, 3))

print("形状:", arr.shape) # (240, 320, 3) -> 高240,宽320,通道3
print("维度:", arr.ndim) # 3
print("元素总数:", arr.size) # 240*320*3 = 230400
print("数据类型:", arr.dtype) # int64(可能不同)

4. 索引与切片(重点)

# 一维数组
a = np.array([10, 20, 30, 40, 50])
print(a[0]) # 10
print(a[1:4]) # [20 30 40] 从索引1到3(不包含4)
print(a[:3]) # [10 20 30] 从开头到索引2
print(a[::2]) # [10 30 50] 每隔一个取一个

# 二维数组
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(b[1, 2]) # 6 第2行第3列(行和列索引都从0开始)
print(b[0, :]) # [1 2 3] 第一行所有列
print(b[:, 1]) # [2 5 8] 所有行的第二列
print(b[0:2, 1:3]) # [[2 3] [5 6]] 行0-1,列1-2

# 三维数组(图像)
img = np.random.randint(0, 256, (100, 100, 3)) # 100×100彩色图
pixel = img[50, 30] # 第50行,第30列的像素值(一个包含BGR三个值的数组)
green_channel = img[:, :, 1] # 取出绿色通道(索引为1)的所有值,得到100×100的二维数组
# 将ROI区域(20-40行,30-50列)所有像素设为红色(BGR顺序)
img[20:40, 30:50] = [0, 0, 255]

5. 数组运算

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # [5 7 9] 对应元素相加
print(a * b) # [4 10 18] 对应元素相乘
print(a ** 2) # [1 4 9] 每个元素平方
print(a + 10) # [11 12 13] 标量加法(广播机制)

# 广播机制:不同形状的数组运算时自动扩展
arr = np.array([[1, 2, 3], [4, 5, 6]])
row = np.array([10, 20, 30])
result = arr + row # row被广播到每一行
# [[11 22 33]
# [14 25 36]]

6. 常用统计函数

print(np.sum(arr)) # 所有元素和
print(np.mean(arr)) # 平均值
print(np.max(arr)) # 最大值
print(np.min(arr)) # 最小值
print(np.std(arr)) # 标准差


三、Matplotlib基础:显示图像

Matplotlib是一个强大的绘图库,我们主要用它来显示图像。

1. 导入Matplotlib

import matplotlib.pyplot as plt # 导入pyplot模块,并起名plt

2. 显示灰度图

import numpy as np
import matplotlib.pyplot as plt

# 生成一个100×100的随机数组(模拟灰度图)
gray_img = np.random.rand(100, 100) # 值在0~1之间

# 用imshow显示,cmap='gray'表示灰度颜色映射
plt.imshow(gray_img, cmap='gray')
plt.title("随机灰度图") # 添加标题
plt.axis('off') # 关闭坐标轴
plt.colorbar() # 显示颜色条,可以看到数值与灰度的对应关系
plt.show() # 显示窗口

解释:plt.imshow() 将数组显示为图像,cmap 是颜色映射(colormap),灰度图用'gray',也可以用'hot'、'viridis'等得到伪彩色。plt.show() 必须调用才能弹出窗口。

3. 显示彩色图

彩色图需要三维数组,形状为 (高, 宽, 3),三个通道的顺序通常是RGB。

# 生成一个纯红色的图像(100×100)
red_img = np.zeros((100, 100, 3), dtype=np.uint8) # 全黑
red_img[:, :, 0] = 0 # B通道(索引0)设为0
red_img[:, :, 1] = 0 # G通道设为0
red_img[:, :, 2] = 255 # R通道设为255(最大值)

plt.imshow(red_img)
plt.title("纯红色图像(RGB顺序)")
plt.show()

4. 多子图显示

plt.subplot(1, 2, 1) # 1行2列,第1个图
plt.imshow(gray_img, cmap='gray')
plt.title("灰度图")

plt.subplot(1, 2, 2) # 第2个图
plt.imshow(red_img)
plt.title("红色图")

plt.tight_layout() # 自动调整间距
plt.show()

5. 保存图像

plt.imshow(gray_img, cmap='gray')
plt.savefig('output.png', dpi=300, bbox_inches='tight') # 保存为PNG文件


四、综合案例1:创建随机数组并显示为灰度图

这个案例帮助你理解“图像就是数组”的核心思想。

import numpy as np
import matplotlib.pyplot as plt

# 创建一个256×256的随机数组,值在0~1之间
random_array = np.random.rand(256, 256)

# 用matplotlib显示为灰度图
plt.imshow(random_array, cmap='gray')
plt.title('随机生成的灰度图')
plt.axis('off') # 关闭坐标轴,让图片更干净
plt.colorbar() # 显示颜色条,可以看到数值与灰度的对应关系
plt.show()

运行效果:你会看到一个由随机噪点组成的灰度图,每个像素的亮度对应随机数值。

思考:如果把 cmap='gray' 改成 cmap='hot',图片会变成热力图风格,数值高的地方偏红,低的地方偏黑。


五、综合案例2:读取图片并对比OpenCV与Matplotlib显示差异

这是机器视觉入门最重要的一个案例,让你理解BGR和RGB的区别。

第一步:准备一张图片

在代码所在文件夹放一张彩色图片,命名为 example.jpg(可以用手机随便拍一张)。

第二步:编写代码

# 1. 导入所需库
import cv2 # OpenCV库
import numpy as np # NumPy库
import matplotlib.pyplot as plt # Matplotlib绘图库

# 2. 用OpenCV读取图片
# cv2.imread() 读取图片,返回的是NumPy数组,颜色通道顺序是BGR
img_bgr = cv2.imread('example.jpg') # 如果图片不在当前目录,需要写完整路径

# 检查图片是否读取成功
if img_bgr is None:
print("错误:无法读取图片,请检查路径")
exit()

# 3. 用OpenCV显示图片
cv2.imshow('OpenCV窗口(BGR)', img_bgr) # 创建窗口并显示图片
cv2.waitKey(0) # 等待按键,参数0表示无限等待,按任意键继续
cv2.destroyAllWindows() # 关闭所有OpenCV窗口

# 4. 将BGR转换为RGB(因为Matplotlib需要RGB顺序)
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)

# 5. 用Matplotlib显示对比
plt.figure(figsize=(10, 4)) # 设置画布大小

plt.subplot(1, 2, 1)
plt.imshow(img_bgr) # 直接显示BGR图片(颜色会失真)
plt.title('Matplotlib直接显示BGR(颜色错误)')

plt.subplot(1, 2, 2)
plt.imshow(img_rgb) # 显示转换后的RGB图片
plt.title('Matplotlib显示RGB(正确)')

plt.tight_layout()
plt.show()

代码详解

  • import cv2:导入OpenCV库,cv2是OpenCV的Python模块名。
  • cv2.imread():读取图片,返回NumPy数组,通道顺序是BGR(蓝、绿、红)。这是OpenCV的历史原因。
  • cv2.imshow():创建窗口显示图片,第一个参数是窗口名,第二个是图片数组。
  • cv2.waitKey(0):等待用户按键,如果不加这一行,窗口会一闪而过。
  • cv2.destroyAllWindows():关闭所有OpenCV创建的窗口。
  • cv2.cvtColor():颜色空间转换函数,cv2.COLOR_BGR2RGB 表示从BGR转到RGB。
  • plt.subplot():创建子图,参数分别为行数、列数、当前第几个。
  • plt.imshow():显示图片数组,如果是三维,默认通道顺序为RGB。
  • plt.show():显示所有Matplotlib图形窗口。

运行效果

  • OpenCV窗口颜色正常。
  • Matplotlib第一个子图颜色偏蓝(因为把BGR当成了RGB)。
  • Matplotlib第二个子图颜色正常(因为做了转换)。

常见问题:中文路径

cv2.imread 不支持中文路径,可以用以下方法解决:

import numpy as np
import cv2
# 从文件读取字节流
with open('中文图片.jpg', 'rb') as f:
img_bytes = f.read()
img_bgr = cv2.imdecode(np.frombuffer(img_bytes, np.uint8), cv2.IMREAD_COLOR)


六、总结与下一步

通过本文的学习,你应该掌握了:

  • Python最常用的基础语法(变量、条件、循环、函数、列表推导式)。
  • NumPy数组的创建、属性、索引切片和基本运算。
  • Matplotlib显示图像的基本方法,以及BGR与RGB的区别。
  • 两个实战案例,让你亲身体验图像处理的基本流程。

下一步:我们将正式进入OpenCV的世界,学习图像滤波、边缘检测、形态学操作等,为缺陷检测项目打下基础。欢迎继续关注!


📚 参考文档链接

  • 菜鸟教程 —— 最全面的中文编程入门网站,包含Python基础语法、实例教程,适合新手快速查阅
  • 廖雪峰的官方网站 —— 国内知名Python教程,从基础到实战项目,讲解通俗易懂,适合系统学习
  • Python官方教程 —— 最权威的Python基础教程
  • NumPy快速入门 —— NumPy官方文档,包含数组操作详解
  • Matplotlib教程 —— Matplotlib官方教程,涵盖各种绘图技巧
  • OpenCV-Python教程 —— OpenCV官方Python教程,后续学习的核心资料

如果你觉得这篇文章对你有帮助,请点赞收藏,有问题欢迎评论区留言~

赞(0)
未经允许不得转载:171主机测评 » Python机器视觉必备基础:Python基础语法+NumPy + Matplotlib
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址