共计 8683 个字符,预计需要花费 22 分钟才能阅读完成。
计算机视觉是人工智能的重要分支,而图像基础处理是计算机视觉的基石。本课程将介绍图像处理的基本概念和操作,包括图像采集、色彩空间转换以及常见的图像基本操作(缩放、旋转、裁剪)。掌握这些基础内容,将为后续的特征提取、目标识别等高级应用打下坚实基础。
一、图像采集
1.1 图像获取方式
1.1.1 从文件加载图像
import cv2
# 从文件读取图像
img = cv2.imread('image.jpg') # 返回 BGR 格式的图像数组
注意:OpenCV 默认使用 BGR 色彩空间,而非常见的 RGB。
1.1.2 从摄像头捕获图像
import cv2
# 初始化摄像头
cap = cv2.VideoCapture(0) # 0 表示默认摄像头
# 读取一帧图像
ret, frame = cap.read()
# 显示图像
cv2.imshow('Camera Feed', frame)
# 释放资源
cap.release()
cv2.destroyAllWindows()
1.1.3 从网络流获取图像
import cv2
# 从网络摄像头流获取图像
url = 'http://192.168.1.100:8080/video'
cap = cv2.VideoCapture(url)
# 读取并显示图像
while True:
ret, frame = cap.read()
cv2.imshow('Network Camera', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
二、色彩空间转换
2.1 色彩空间基础
2.1.1 RGB 与 HSV 对比
| 特性 | RGB | HSV |
|---|---|---|
| 表示方式 | 红、绿、蓝三原色组合 | 色相(Hue)、饱和度(Saturation)、明度(Value) |
| 适用场景 | 显示系统 | 颜色识别、分割 |
| 对光照敏感度 | 高 | 低 |
| OpenCV 范围 | 0-255 | H:0-180, S:0-255, V:0-255 |
HSV 详细含义:
- Hue(色相):表示颜色类型,范围是 0~180(OpenCV 中 8 位图像将 0~360 缩放到此范围)
- Saturation(饱和度):颜色的纯度,0(灰色)~255(完全饱和)
- Value(明度):颜色亮度,0(黑色)~255(最亮)
2.2 OpenCV 中的色彩空间转换
2.2.1 cvtColor函数详解
cv2.cvtColor(src, code[, dst[, dstCn]])
参数说明:
src:输入图像(如 BGR 格式的 Mat 对象)code:颜色空间转换代码cv2.COLOR_BGR2HSV:BGR 转 HSVcv2.COLOR_HSV2BGR:HSV 转 BGRcv2.COLOR_BGR2GRAY:BGR 转灰度dst:输出图像(可选)dstCn:输出图像的通道数(默认 0 表示自动推导)
2.2.2 实用转换示例
import cv2
import numpy as np
# 读取图像
img = cv2.imread('image.jpg')
# BGR 转 HSV
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# HSV 转 BGR
bgr_img = cv2.cvtColor(hsv_img, cv2.COLOR_HSV2BGR)
# BGR 转灰度
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('HSV', hsv_img)
cv2.imshow('BGR from HSV', bgr_img)
cv2.imshow('Gray', gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2.3 实际应用:颜色阈值分割
import cv2
import numpy as np
# 读取图像
img = cv2.imread('color_image.jpg')
# 转换为 HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 定义红色范围(HSV)lower_red1 = np.array([0, 100, 100])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 100, 100])
upper_red2 = np.array([180, 255, 255])
# 创建掩码
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = cv2.bitwise_or(mask1, mask2)
# 应用掩码
result = cv2.bitwise_and(img, img, mask=mask)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Mask', mask)
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、基本图像操作
3.1 图像缩放
3.1.1 使用 resize 函数
import cv2
# 读取图像
img = cv2.imread('image.jpg')
# 按比例缩放
resized = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)
# 指定尺寸缩放
resized_fixed = cv2.resize(img, (800, 600), interpolation=cv2.INTER_AREA)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Resized (50%)', resized)
cv2.imshow('Resized (800x600)', resized_fixed)
cv2.waitKey(0)
cv2.destroyAllWindows()
常用缩放算法:
cv2.INTER_NEAREST:最近邻插值(最快,质量最低)cv2.INTER_LINEAR:双线性插值(默认,平衡速度与质量)cv2.INTER_AREA:区域插值(缩小图像时效果更好)cv2.INTER_CUBIC:三次样条插值(质量最高,速度最慢)
3.2 图像旋转
3.2.1 使用 getRotationMatrix2D 和warpAffine
import cv2
import numpy as np
# 读取图像
img = cv2.imread('image.jpg')
height, width = img.shape[:2]
# 旋转参数
angle = 45 # 旋转角度
center = (width/2, height/2) # 旋转中心
scale = 1.0 # 缩放比例
# 获取旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, scale)
# 应用旋转
rotated = cv2.warpAffine(img, M, (width, height))
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Rotated', rotated)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.3 图像裁剪
3.3.1 使用切片操作
import cv2
# 读取图像
img = cv2.imread('image.jpg')
# 获取图像尺寸
height, width = img.shape[:2]
# 裁剪参数(左上角坐标和宽高)x = 100
y = 50
w = 300
h = 200
# 裁剪图像
cropped = img[y:y+h, x:x+w]
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Cropped', cropped)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、实践练习
1. 基础操作综合练习
编写一个程序,实现:
- 从摄像头捕获图像
- 将图像转换为 HSV 色彩空间
- 通过阈值分割提取特定颜色区域
- 将结果图像缩放并显示
2. 色彩空间探索
尝试以下色彩空间转换:
- BGR 转 LAB
- BGR 转 YCrCb
- HSV 转 RGB
- 了解不同色彩空间在不同场景下的优势
3. 图像增强
尝试应用以下增强技术:
- 调整亮度 / 对比度
- 应用灰度直方图均衡化
- 添加噪声并应用滤波
五、常见问题与解决
- 为什么 OpenCV 读取的图像是 BGR 格式?
- OpenCV 是基于 C ++ 开发的,最初设计时使用 BGR,与许多图像处理库(如 Matlab)使用 RGB 不同。
- 如何在 Matplotlib 中正确显示 OpenCV 图像?
- Matplotlib 使用 RGB 格式,而 OpenCV 使用 BGR,需要转换:
python import matplotlib.pyplot as plt plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
- 色彩空间转换时,为什么 HSV 的 H 值范围是 0 -180?
- OpenCV 将 HSV 的 H 值范围从 0 -360 压缩到 0 -180,以适应 8 位图像存储,节省内存。
- 图像缩放时,如何保持宽高比?
- 计算缩放比例时,根据原始宽高比计算:
python scale = 0.5 # 缩放比例 new_width = int(width * scale) new_height = int(height * scale) resized = cv2.resize(img, (new_width, new_height))
六、学习资源
- 官方文档:
- OpenCV: https://docs.opencv.org/
- NumPy: https://numpy.org/doc/
- 推荐学习路径:
- 图像基础处理 → 特征提取 → 目标检测 → 图像分割
- 实践建议:
- 每天尝试一个图像处理操作
- 用不同图像测试操作效果
- 记录操作结果和观察
本课小结
在本课中,我们学习了计算机视觉的图像基础处理:
- 图像采集的多种方式
- 色彩空间转换(特别是 HSV)的原理和应用
- 基本图像操作(缩放、旋转、裁剪)的实现
提示:在实际应用中,经常需要组合使用这些基础操作。例如,先将图像转换为 HSV 色彩空间,然后进行阈值分割,再进行缩放和裁剪。熟练掌握这些基础操作,将大大提高你的计算机视觉应用能力。
附录
1. 基础操作综合练习
import cv2
import numpy as np
# 初始化摄像头
cap = cv2.VideoCapture(0) # 0 表示默认摄像头
# 检查摄像头是否成功打开
if not cap.isOpened():
print("无法打开摄像头")
exit()
print("按'q'键退出视频流")
while True:
# 从摄像头捕获一帧
ret, frame = cap.read()
if not ret:
print("无法捕获视频帧")
break
# 转换为 HSV 色彩空间
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 定义红色的 HSV 范围(注意:红色在 HSV 中跨 0 和 180)lower_red1 = np.array([0, 100, 100])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 100, 100])
upper_red2 = np.array([180, 255, 255])
# 创建两个掩码并合并
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = cv2.bitwise_or(mask1, mask2)
# 应用掩码提取红色区域
result = cv2.bitwise_and(frame, frame, mask=mask)
# 将结果图像缩放(50% 大小)scaled_result = cv2.resize(result, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)
# 显示原始图像和处理结果
cv2.imshow('Original Camera Feed', frame)
cv2.imshow('HSV Mask', mask)
cv2.imshow('Red Object Detection', scaled_result)
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头资源
cap.release()
cv2.destroyAllWindows()
运行说明:
- 确保摄像头可用
- 运行后会打开三个窗口:
- 原始摄像头画面
- HSV 颜色掩码(红色区域显示为白色)
- 缩放后的红色物体检测结果
- 按
q键退出
2. 色彩空间探索
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 读取图像(替换为你的图片路径)img = cv2.imread('example.jpg')
if img is None:
print("无法读取图像,请检查文件路径")
exit()
# 转换为 RGB 用于 Matplotlib 显示
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 1. BGR 转 LAB
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
# 2. BGR 转 YCrCb
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
# 3. HSV 转 RGB(先转 HSV 再转 RGB)hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
rgb_from_hsv = cv2.cvtColor(hsv, cv2.COLOR_HSV2RGB)
# 创建子图
plt.figure(figsize=(15, 10))
# 原始图像
plt.subplot(2, 3, 1)
plt.imshow(img_rgb)
plt.title('Original (BGR→RGB)')
plt.axis('off')
# LAB 色彩空间
plt.subplot(2, 3, 2)
plt.imshow(lab)
plt.title('LAB Color Space')
plt.axis('off')
# YCrCb 色彩空间
plt.subplot(2, 3, 3)
plt.imshow(ycrcb)
plt.title('YCrCb Color Space')
plt.axis('off')
# HSV 色彩空间
plt.subplot(2, 3, 4)
plt.imshow(hsv)
plt.title('HSV Color Space')
plt.axis('off')
# HSV 转 RGB
plt.subplot(2, 3, 5)
plt.imshow(rgb_from_hsv)
plt.title('HSV→RGB')
plt.axis('off')
# 原始图像的 HSV 通道(用于对比)h, s, v = cv2.split(hsv)
plt.subplot(2, 3, 6)
plt.imshow(v, cmap='gray')
plt.title('V Channel (Value)')
plt.axis('off')
plt.tight_layout()
plt.savefig('color_spaces.png', dpi=300)
plt.show()
# 打印色彩空间转换说明
print("\n 色彩空间转换优势说明:")
print("1. HSV: 适合颜色识别,对光照变化不敏感(Hue 通道独立于亮度)")
print("2. LAB: 接近人眼感知,用于颜色校正和图像编辑")
print("3. YCrCb: 视频压缩标准(如 JPEG),Y 通道为亮度,Cr/Cb 为色度")
print("4. BGR→RGB: Matplotlib 显示时需要转换(OpenCV 默认 BGR)")
运行说明:
- 准备一张测试图片(
example.jpg) - 运行后将生成包含 6 个子图的图表
- 图表将保存为
color_spaces.png - 控制台会打印色彩空间优势说明
3. 图像增强
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('example.jpg')
if img is None:
print("无法读取图像,请检查文件路径")
exit()
# 转为灰度图(用于直方图均衡化)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 1. 调整亮度 / 对比度
# 公式: dst = alpha * src + beta
alpha = 1.5 # 对比度 (1.0-3.0)
beta = 50 # 亮度 (0-100)
adjusted = cv2.convertScaleAbs(img, alpha=alpha, beta=beta)
# 2. 灰度直方图均衡化
equalized = cv2.equalizeHist(gray)
# 创建子图
plt.figure(figsize=(15, 12))
# 原始图像
plt.subplot(3, 2, 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')
# 调整亮度 / 对比度
plt.subplot(3, 2, 2)
plt.imshow(cv2.cvtColor(adjusted, cv2.COLOR_BGR2RGB))
plt.title(f'Adjusted (alpha={alpha}, beta={beta})')
plt.axis('off')
# 原始灰度图
plt.subplot(3, 2, 3)
plt.imshow(gray, cmap='gray')
plt.title('Grayscale Original')
plt.axis('off')
# 直方图均衡化
plt.subplot(3, 2, 4)
plt.imshow(equalized, cmap='gray')
plt.title('Histogram Equalized')
plt.axis('off')
# 原始直方图
plt.subplot(3, 2, 5)
plt.hist(gray.ravel(), 256, [0, 256])
plt.title('Original Histogram')
plt.xlabel('Pixel Intensity')
plt.ylabel('Frequency')
# 均衡化后直方图
plt.subplot(3, 2, 6)
plt.hist(equalized.ravel(), 256, [0, 256])
plt.title('Equalized Histogram')
plt.xlabel('Pixel Intensity')
plt.ylabel('Frequency')
plt.tight_layout()
plt.savefig('image_enhancement.png', dpi=300)
plt.show()
# 打印增强效果说明
print("\n 图像增强效果说明:")
print("1. 亮度 / 对比度调整: 通过 alpha 和 beta 参数控制")
print("- alpha > 1: 增加对比度")
print("- beta > 0: 增加亮度")
print("2. 直方图均衡化: 使图像像素分布更均匀,增强对比度")
print("- 特别适合曝光不足或过度的图像")
print("- 通常用于灰度图像")
运行说明:
- 准备一张测试图片(
example.jpg) - 运行后将生成包含 6 个子图的图表
- 图表将保存为
image_enhancement.png - 控制台会打印增强效果说明
实践指南与常见问题
环境配置
# 安装必要的库
pip install opencv-python numpy matplotlib
常见问题解决
- 摄像头无法打开
- 检查摄像头是否被其他程序占用
- 尝试使用
cap = cv2.VideoCapture(1)(不同设备可能需要不同索引)
- 图像路径错误
- 确保
example.jpg在当前工作目录 - 或使用完整路径:
img = cv2.imread('/path/to/example.jpg')
- Matplotlib 显示问题
- 在 Jupyter Notebook 中添加:
%matplotlib inline - 在脚本中确保
plt.show()在最后
- 颜色空间转换异常
- 确保使用正确的转换代码(如
cv2.COLOR_BGR2HSV) - 避免在 HSV 中使用
cv2.COLOR_RGB2HSV(OpenCV 使用 BGR)
实践建议
- 从简单开始:
- 先尝试单个操作(如只做色彩空间转换)
- 熟悉后再组合多个操作
- 多图对比:
- 对比不同色彩空间下的图像处理效果
- 比较不同参数对图像增强的影响
- 实际应用:
- 用不同颜色的物体测试颜色阈值分割
- 尝试调整亮度 / 对比度参数观察效果变化
- 扩展思考:
- 为什么 HSV 对颜色识别更好?
- 直方图均衡化为什么能增强图像?
- 在什么场景下使用 LAB 色彩空间更合适?
总结
通过这三个实践练习,你已经掌握了计算机视觉的 图像基础处理 核心技能:
| 技术 | 关键点 | 实际应用 |
|---|---|---|
| 图像采集 | 摄像头 / 文件读取 | 实时视频处理 |
| 色彩空间转换 | HSV/BGR/LAB/YCrCb | 颜色识别、图像增强 |
| 基本操作 | 缩放、旋转、裁剪 | 图像预处理 |
| 图像增强 | 亮度 / 对比度调整、直方图均衡 | 提升图像质量 |
重要提示:在实际项目中,这些基础操作通常会组合使用。例如,先进行色彩空间转换(HSV),再进行阈值分割,最后进行图像缩放。熟练掌握这些基础操作,将为后续的特征提取、目标检测等高级应用打下坚实基础。
正文完

