计算机视觉入门第0课续:图像基础处理

29次阅读
没有评论

共计 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 转 HSV
  • cv2.COLOR_HSV2BGR:HSV 转 BGR
  • cv2.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 使用 getRotationMatrix2DwarpAffine

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. 基础操作综合练习

编写一个程序,实现:

  1. 从摄像头捕获图像
  2. 将图像转换为 HSV 色彩空间
  3. 通过阈值分割提取特定颜色区域
  4. 将结果图像缩放并显示

2. 色彩空间探索

尝试以下色彩空间转换:

  • BGR 转 LAB
  • BGR 转 YCrCb
  • HSV 转 RGB
  • 了解不同色彩空间在不同场景下的优势

3. 图像增强

尝试应用以下增强技术:

  • 调整亮度 / 对比度
  • 应用灰度直方图均衡化
  • 添加噪声并应用滤波

五、常见问题与解决

  1. 为什么 OpenCV 读取的图像是 BGR 格式?
  • OpenCV 是基于 C ++ 开发的,最初设计时使用 BGR,与许多图像处理库(如 Matlab)使用 RGB 不同。
  1. 如何在 Matplotlib 中正确显示 OpenCV 图像?
  • Matplotlib 使用 RGB 格式,而 OpenCV 使用 BGR,需要转换:
    python import matplotlib.pyplot as plt plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
  1. 色彩空间转换时,为什么 HSV 的 H 值范围是 0 -180?
  • OpenCV 将 HSV 的 H 值范围从 0 -360 压缩到 0 -180,以适应 8 位图像存储,节省内存。
  1. 图像缩放时,如何保持宽高比?
  • 计算缩放比例时,根据原始宽高比计算:
    python scale = 0.5 # 缩放比例 new_width = int(width * scale) new_height = int(height * scale) resized = cv2.resize(img, (new_width, new_height))

六、学习资源

  1. 官方文档
  • OpenCV: https://docs.opencv.org/
  • NumPy: https://numpy.org/doc/
  1. 推荐学习路径
  • 图像基础处理 → 特征提取 → 目标检测 → 图像分割
  1. 实践建议
  • 每天尝试一个图像处理操作
  • 用不同图像测试操作效果
  • 记录操作结果和观察

本课小结

在本课中,我们学习了计算机视觉的图像基础处理:

  1. 图像采集的多种方式
  2. 色彩空间转换(特别是 HSV)的原理和应用
  3. 基本图像操作(缩放、旋转、裁剪)的实现

提示:在实际应用中,经常需要组合使用这些基础操作。例如,先将图像转换为 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()

运行说明

  1. 确保摄像头可用
  2. 运行后会打开三个窗口:
  • 原始摄像头画面
  • HSV 颜色掩码(红色区域显示为白色)
  • 缩放后的红色物体检测结果
  1. 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)")

运行说明

  1. 准备一张测试图片(example.jpg
  2. 运行后将生成包含 6 个子图的图表
  3. 图表将保存为 color_spaces.png
  4. 控制台会打印色彩空间优势说明

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("- 通常用于灰度图像")

运行说明

  1. 准备一张测试图片(example.jpg
  2. 运行后将生成包含 6 个子图的图表
  3. 图表将保存为 image_enhancement.png
  4. 控制台会打印增强效果说明

实践指南与常见问题

环境配置

# 安装必要的库
pip install opencv-python numpy matplotlib

常见问题解决

  1. 摄像头无法打开
  • 检查摄像头是否被其他程序占用
  • 尝试使用 cap = cv2.VideoCapture(1)(不同设备可能需要不同索引)
  1. 图像路径错误
  • 确保 example.jpg 在当前工作目录
  • 或使用完整路径:img = cv2.imread('/path/to/example.jpg')
  1. Matplotlib 显示问题
  • 在 Jupyter Notebook 中添加:%matplotlib inline
  • 在脚本中确保 plt.show() 在最后
  1. 颜色空间转换异常
  • 确保使用正确的转换代码(如 cv2.COLOR_BGR2HSV
  • 避免在 HSV 中使用 cv2.COLOR_RGB2HSV(OpenCV 使用 BGR)

实践建议

  1. 从简单开始
  • 先尝试单个操作(如只做色彩空间转换)
  • 熟悉后再组合多个操作
  1. 多图对比
  • 对比不同色彩空间下的图像处理效果
  • 比较不同参数对图像增强的影响
  1. 实际应用
  • 用不同颜色的物体测试颜色阈值分割
  • 尝试调整亮度 / 对比度参数观察效果变化
  1. 扩展思考
  • 为什么 HSV 对颜色识别更好?
  • 直方图均衡化为什么能增强图像?
  • 在什么场景下使用 LAB 色彩空间更合适?

总结

通过这三个实践练习,你已经掌握了计算机视觉的 图像基础处理 核心技能:

技术 关键点 实际应用
图像采集 摄像头 / 文件读取 实时视频处理
色彩空间转换 HSV/BGR/LAB/YCrCb 颜色识别、图像增强
基本操作 缩放、旋转、裁剪 图像预处理
图像增强 亮度 / 对比度调整、直方图均衡 提升图像质量

重要提示:在实际项目中,这些基础操作通常会组合使用。例如,先进行色彩空间转换(HSV),再进行阈值分割,最后进行图像缩放。熟练掌握这些基础操作,将为后续的特征提取、目标检测等高级应用打下坚实基础。

正文完
 0
一诺
版权声明:本站原创文章,由 一诺 于2025-08-01发表,共计8683字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码