共计 6773 个字符,预计需要花费 17 分钟才能阅读完成。
图像处理是计算机视觉的基石,是将原始图像转换为更适合后续分析的形式的过程。本课程将深入探讨图像处理的基础概念、色彩空间原理、基本操作方法以及图像质量评估指标,为后续的特征提取、目标识别等高级应用奠定坚实基础。
一、基础概念
1.1 计算机视觉定义与应用领域
定义 :
计算机视觉(Computer Vision)是人工智能领域的一个重要分支,专注于使计算机和系统能够从图像、视频等视觉输入中提取有意义的信息,并据此进行决策或提供建议。它通过理解和处理二维图像来重建三维场景,从而实现对现实世界的深入理解。
应用领域:
- 医疗领域:医学影像分析、病灶检测和诊断
- 交通领域:车辆检测、跟踪和交通流量的智能控制
- 安全监控:人脸识别、行为分析、异常检测
- 智能家居:智能控制、家庭安全
- 自动驾驶:环境感知、障碍物检测、路径规划
- 工业自动化:产品质量检测、机器人视觉引导
小知识:计算机视觉从 1950 年代的基础图像处理技术起步,逐步探索二维到三维信息的提取。1990 年代以来,随着向实际应用的转向,如对象识别和运动分析等领域取得了显著进展。2010 年代,深度学习的兴起极大促进了新技术的发展。
1.2 图像表示与色彩空间
1.2.1 图像的基本表示
像素(Pixel):构成图像的最小单位,是图像的基本元素。一幅图像可以看作是由许多像素组成的二维数组,每个像素包含一个或多个数值,表示该位置的颜色信息。
位图与矢量图:
- 位图:由像素点组成的图像,每个像素记录颜色信息。位图适合表现色彩丰富、过渡自然的图像,但放大时会出现锯齿。
- 矢量图:由数学公式定义的线条和形状组成的图像,放大时不会失真。适合表现简单、清晰的图形,但不适合表现复杂的色彩变化。
1.2.2 常见色彩空间
| 色彩空间 | 说明 | 适用场景 | 优点 |
|---|---|---|---|
| RGB | 红 (Red)、绿(Green)、蓝(Blue) 三原色组合 | 显示系统、图像处理 | 与人眼感知一致,广泛应用于显示设备 |
| HSV | 色相(Hue)、饱和度(Saturation)、明度(Value) | 颜色识别、分割 | 对光照变化不敏感,Hue 通道独立于亮度 |
| LAB | 亮度(L)、a(绿 - 红)、b(蓝 - 黄) | 颜色校正、图像编辑 | 接近人眼感知,用于精确颜色处理 |
| YCrCb | 亮度(Y)、色差(Cr, Cb) | 视频压缩(JPEG、MPEG) | 亮度与色度分离,适合压缩 |
| 灰度 | 0-255 的单通道值 | 图像分析、特征提取 | 简化处理,减少计算量 |
色彩空间转换:
import cv2
# 读取图像
img = cv2.imread('example.jpg')
# RGB 转 HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 注意:OpenCV 默认 BGR
# HSV 转 RGB
rgb = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
# BGR 转 LAB
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
# BGR 转 YCrCb
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
# BGR 转灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
色彩空间选择建议:
- 颜色识别:优先使用 HSV
- 颜色校正:优先使用 LAB
- 视频压缩:优先使用 YCrCb
- 简单图像分析:优先使用灰度
1.3 基本图像处理操作
1.3.1 图像缩放
缩放原理:调整图像的像素尺寸,可以放大或缩小图像。
常用缩放算法:
cv2.INTER_NEAREST:最近邻插值(最快,质量最低)cv2.INTER_LINEAR:双线性插值(默认,平衡速度与质量)cv2.INTER_AREA:区域插值(缩小图像时效果更好)cv2.INTER_CUBIC:三次样条插值(质量最高,速度最慢)
import cv2
# 读取图像
img = cv2.imread('example.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)
1.3.2 图像旋转
旋转原理:围绕指定中心点旋转图像,保持图像内容的相对位置。
import cv2
import numpy as np
# 读取图像
img = cv2.imread('example.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))
1.3.3 图像裁剪
裁剪原理:通过指定坐标和尺寸,从原始图像中提取一个子区域。
import cv2
# 读取图像
img = cv2.imread('example.jpg')
# 获取图像尺寸
height, width = img.shape[:2]
# 裁剪参数(左上角坐标和宽高)x = 100
y = 50
w = 300
h = 200
# 裁剪图像
cropped = img[y:y+h, x:x+w]
1.3.4 图像翻转
翻转原理:沿水平或垂直轴翻转图像。
import cv2
# 读取图像
img = cv2.imread('example.jpg')
# 水平翻转(左右翻转)flip_horizontal = cv2.flip(img, 1)
# 垂直翻转(上下翻转)flip_vertical = cv2.flip(img, 0)
# 水平 + 垂直翻转
flip_both = cv2.flip(img, -1)
1.4 图像质量评估指标
1.4.1 常用评估指标
| 指标 | 说明 | 计算方式 | 适用场景 |
|---|---|---|---|
| PSNR | 峰值信噪比 | PSNR = 10 * log10(MAX² / MSE) |
图像压缩、复原质量评估 |
| SSIM | 结构相似性 | 基于结构、亮度和对比度的相似性度量 | 图像质量评估,更符合人眼感知 |
| MSE | 均方误差 | MSE = mean((img1 - img2)²) |
图像复原、压缩质量评估 |
| SNR | 信噪比 | SNR = 10 * log10(信号功率 / 噪声功率) |
信号处理、图像质量评估 |
PSNR 计算示例:
import cv2
import numpy as np
def calculate_psnr(img1, img2):
mse = np.mean((img1 - img2) ** 2)
if mse == 0:
return 100
max_pixel = 255.0
psnr = 20 * np.log10(max_pixel / np.sqrt(mse))
return psnr
# 读取原始图像和处理后的图像
img1 = cv2.imread('original.jpg')
img2 = cv2.imread('processed.jpg')
psnr = calculate_psnr(img1, img2)
print(f"PSNR: {psnr:.2f} dB")
1.4.2 评估指标选择建议
- 图像压缩:PSNR 和 SSIM
- 图像复原:PSNR 和 SSIM
- 图像增强:SSIM(更符合人眼感知)
- 图像比较:SSIM 和 PSNR 结合使用
二、图像处理核心原理
2.1 线性与非线性操作
线性操作:对整幅图像所有像素进行相同处理,输出是输入的线性组合。
# 线性操作示例:调整亮度
def adjust_brightness(img, alpha=1.0, beta=0):
return cv2.convertScaleAbs(img, alpha=alpha, beta=beta)
非线性操作:对单个像素或像素间关系进行处理,输出不是输入的线性组合。
# 非线性操作示例:图像二值化
def thresholding(img, threshold=128):
_, thresh = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)
return thresh
2.2 图像卷积与滤波
卷积原理:使用一个滤波器(卷积核)在图像上滑动,计算每个位置的加权和,生成新的图像。
import cv2
import numpy as np
# 定义一个简单的卷积核(边缘检测)kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
# 应用卷积
filtered = cv2.filter2D(img, -1, kernel)
常用滤波器:
- 锐化滤波器:增强图像边缘
- 模糊滤波器:平滑图像,去除噪声
- 边缘检测滤波器:如 Sobel、Canny
- 高斯滤波器:用于图像平滑
三、实践项目
3.1 图像增强与质量评估
import cv2
import numpy as np
import matplotlib.pyplot as plt
def calculate_psnr(img1, img2):
mse = np.mean((img1 - img2) ** 2)
if mse == 0:
return 100
max_pixel = 255.0
psnr = 20 * np.log10(max_pixel / np.sqrt(mse))
return psnr
def calculate_ssim(img1, img2):
# 实际应用中使用 cv2's SSIM implementation
# 这里仅做示例
return 0.9 # 示例值
# 读取图像
img = cv2.imread('example.jpg')
# 调整亮度和对比度
adjusted = cv2.convertScaleAbs(img, alpha=1.5, beta=50)
# 应用灰度直方图均衡化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
equalized = cv2.equalizeHist(gray)
# 显示结果
plt.figure(figsize=(15, 10))
# 原始图像
plt.subplot(2, 3, 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')
# 亮度 / 对比度调整
plt.subplot(2, 3, 2)
plt.imshow(cv2.cvtColor(adjusted, cv2.COLOR_BGR2RGB))
plt.title('Adjusted (alpha=1.5, beta=50)')
plt.axis('off')
# 直方图均衡化
plt.subplot(2, 3, 3)
plt.imshow(equalized, cmap='gray')
plt.title('Histogram Equalized')
plt.axis('off')
# 原始图像直方图
plt.subplot(2, 3, 4)
plt.hist(img.ravel(), 256, [0, 256])
plt.title('Original Histogram')
plt.xlabel('Pixel Intensity')
plt.ylabel('Frequency')
# 均衡化后直方图
plt.subplot(2, 3, 5)
plt.hist(equalized.ravel(), 256, [0, 256])
plt.title('Equalized Histogram')
plt.xlabel('Pixel Intensity')
plt.ylabel('Frequency')
# PSNR 和 SSIM 评估
psnr = calculate_psnr(img, adjusted)
ssim = calculate_ssim(img, adjusted)
plt.subplot(2, 3, 6)
plt.text(0.5, 0.5, f'PSNR: {psnr:.2f} dB\nSSIM: {ssim:.4f}',
ha='center', va='center', fontsize=14)
plt.axis('off')
plt.title('Quality Metrics')
plt.tight_layout()
plt.savefig('image_enhancement.png', dpi=300)
plt.show()
3.2 色彩空间转换与应用
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('example.jpg')
# 转换为不同色彩空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建子图
plt.figure(figsize=(15, 10))
# 原始图像
plt.subplot(2, 3, 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original (BGR)')
plt.axis('off')
# HSV 色彩空间
plt.subplot(2, 3, 2)
plt.imshow(hsv)
plt.title('HSV Color Space')
plt.axis('off')
# LAB 色彩空间
plt.subplot(2, 3, 3)
plt.imshow(lab)
plt.title('LAB Color Space')
plt.axis('off')
# YCrCb 色彩空间
plt.subplot(2, 3, 4)
plt.imshow(ycrcb)
plt.title('YCrCb Color Space')
plt.axis('off')
# 灰度图像
plt.subplot(2, 3, 5)
plt.imshow(gray, cmap='gray')
plt.title('Grayscale')
plt.axis('off')
# HSV 的 H 通道(色调)h, s, v = cv2.split(hsv)
plt.subplot(2, 3, 6)
plt.imshow(h, cmap='hsv')
plt.title('H Channel (HSV)')
plt.axis('off')
plt.tight_layout()
plt.savefig('color_spaces.png', dpi=300)
plt.show()
四、常见问题与解决
1. 为什么 OpenCV 使用 BGR 而不是 RGB?
- OpenCV 是基于 C ++ 开发的,最初设计时使用 BGR,与许多图像处理库(如 Matlab)使用 RGB 不同。
- 解决方法:在使用 Matplotlib 显示图像时,需要转换为 RGB:
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
2. 如何保持图像缩放比例?
- 计算缩放比例时,根据原始宽高比计算:
scale = 0.5 # 缩放比例
new_width = int(width * scale)
new_height = int(height * scale)
resized = cv2.resize(img, (new_width, new_height))
3. 为什么 HSV 对颜色识别更好?
- HSV 的 Hue 通道(色相)独立于亮度(Value),对光照变化不敏感。
- 例如,红色在 HSV 中可以表示为 [0, 100, 100] 到[10, 255, 255]或 [170, 100, 100] 到[180, 255, 255],不受亮度影响。
4. 如何选择合适的色彩空间?
- 颜色识别:HSV
- 颜色校正:LAB
- 视频压缩:YCrCb
- 简单分析:灰度
五、学习资源
- 官方文档:
- OpenCV: https://docs.opencv.org/
- NumPy: https://numpy.org/doc/
- Matplotlib: https://matplotlib.org/stable/
- 推荐学习路径:
- 图像基础处理 → 特征提取 → 目标检测 → 图像分割
- 实践建议:
- 每天尝试一个图像处理操作
- 用不同图像测试操作效果
- 记录操作结果和观察
本课小结
在本课中,我们学习了计算机视觉的 图像处理基础:
- 计算机视觉定义与应用:理解计算机视觉的定义和在多个领域的应用
- 图像表示与色彩空间:掌握像素、位图 / 矢量图、常见色彩空间及其特点
- 基本图像处理操作:熟练掌握缩放、旋转、裁剪、翻转等基本操作
- 图像质量评估指标:了解 PSNR、SSIM、MSE 等评估指标的原理和应用
重要提示:在实际项目中,这些基础操作通常会组合使用。例如,先进行色彩空间转换(HSV),再进行阈值分割,最后进行图像缩放。熟练掌握这些基础操作,将为后续的特征提取、目标检测等高级应用打下坚实基础。

