跳转至

第1章 计算机视觉基础

⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。

计算机视觉基础图

📚 章节概述

本章介绍计算机视觉的基本概念、发展历史、应用场景以及必要的数学基础。通过本章学习,你将对计算机视觉有一个全面的认识,为后续深入学习打下坚实基础。

学习时间:5-7天 难度等级:⭐⭐ 前置知识:Python基础、线性代数基础

🎯 学习目标

完成本章后,你将能够: - 理解计算机视觉的定义和重要性 - 了解计算机视觉的发展历史和里程碑 - 掌握计算机视觉的核心任务分类 - 熟悉计算机视觉在各行业的应用场景 - 掌握必要的数学基础知识 - 成功搭建开发环境并运行第一个视觉程序


1.1 计算机视觉概述

1.1.1 什么是计算机视觉?

定义:计算机视觉(Computer Vision, CV)是一门研究如何使机器"看"的科学,旨在让计算机和系统能够从图像或多维数据中获取高层次理解。

核心问题: - 图像中有什么?(识别) - 它在哪里?(定位) - 它在做什么?(理解) - 将会发生什么?(预测)

与相关领域的关系

Text Only
计算机视觉 (CV)
图像处理 → 特征提取 → 模式识别 → 机器学习
    ↑                              ↓
数字图像处理                  人工智能

1.1.2 计算机视觉的重要性

为什么计算机视觉如此重要?

  1. 人类感知的数字化:人类70%以上的感知来自视觉,CV让机器具备类似能力
  2. 海量视觉数据:每天产生数十亿张图像和视频,需要自动化处理
  3. 广泛的应用场景:从手机到自动驾驶,从医疗到工业
  4. 商业价值巨大:CV市场规模预计2025年达到500亿美元

CV vs 人类视觉

特性 人类视觉 计算机视觉
速度 快速 可以更快
精度 高度准确 取决于模型
疲劳 容易疲劳 不知疲倦
成本 高(人力) 低(规模化)
适应性 需要训练

1.1.3 计算机视觉的发展历史

里程碑事件

Text Only
1960s: Larry Roberts的"Block World"
       - 第一个CV系统
       - 三维物体识别

1970s: David Marr的视觉计算理论
       - 建立CV理论框架
       - 三层表示理论

1980s: 边缘检测、光流、立体视觉
       - 经典算法成熟
       - 商业应用起步

1990s: 特征提取(SIFT、HOG)
       - 统计学习方法
       - 人脸识别应用

2000s: 深度学习兴起
       - AlexNet (2012)
       - CNN成为主流

2010s: 大规模应用
       - 自动驾驶
       - 医疗影像
       - 智能手机

2020s: 多模态、自监督、大模型
       - CLIP、SAM
       - 生成式AI
       - 边缘AI

关键突破

  1. 2012年 - AlexNet
  2. ImageNet竞赛夺冠
  3. 深度学习统治CV
  4. GPU加速训练

  5. 2014年 - VGG & GoogLeNet

  6. 更深的网络
  7. Inception架构

  8. 2015年 - ResNet

  9. 残差连接
  10. 解决梯度消失
  11. 152层网络

  12. 2017年 - Transformer

  13. 注意力机制
  14. ViT (2020)

  15. 2023年 - SAM (Segment Anything)

  16. 通用分割模型
  17. 零样本能力

  18. 2023年 - 多模态大模型

  19. GPT-4V
  20. 视觉-语言理解

1.1.4 计算机视觉的任务分类

按任务层次分类

Text Only
低层视觉 (Low-level)
├── 图像增强
├── 去噪
├── 边缘检测
└── 特征提取

中层视觉 (Mid-level)
├── 图像分割
├── 目标检测
├── 运动估计
└── 立体匹配

高层视觉 (High-level)
├── 图像分类
├── 场景理解
├── 行为识别
└── 视觉推理

按输入输出分类

任务类型 输入 输出 典型应用
图像分类 图像 类别标签 相机识别、内容审核
目标检测 图像 边界框+类别 自动驾驶、安防监控
语义分割 图像 像素级标签 医疗影像、自动驾驶
实例分割 图像 实例掩码+类别 工业检测、AR/VR
图像生成 文本/噪声 图像 创意设计、数据增强
风格迁移 内容图+风格图 风格化图像 艺术创作、滤镜
图像超分 低分图像 高分图像 医疗影像、老照片修复
视频分析 视频 动作/事件 安防、体育分析

1.2 计算机视觉的应用场景

1.2.1 消费电子

智能手机应用: - 人脸解锁 - 美颜滤镜 - 智能相册(自动分类、搜索) - AR相机(贴纸、特效) - 文字识别(OCR)

示例代码:人脸检测

Python
import cv2
import numpy as np

# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)

# 读取图像
image = cv2.imread('face.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30)
)

# 绘制检测结果
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

1.2.2 自动驾驶

核心CV任务: - 车道线检测 - 交通标志识别 - 行人/车辆检测 - 深度估计 - 语义分割

技术栈

Text Only
摄像头/激光雷达
图像采集
预处理 → 特征提取 → 深度学习模型
目标检测 + 语义分割 + 跟踪
路径规划 + 决策控制

挑战: - 实时性要求(<100ms) - 复杂场景(天气、光照) - 安全性要求(零容忍) - 边缘计算限制

1.2.3 医疗影像

应用场景: - CT/MRI分析:肿瘤检测、器官分割 - X光片诊断:肺炎、骨折检测 - 病理图像:细胞分类、癌症筛查 - 眼科影像:视网膜疾病诊断

案例:COVID-19诊断

Python
import torch
import torch.nn as nn
from torchvision import models, transforms
from PIL import Image

# 加载预训练的ResNet模型
model = models.resnet50(weights=models.ResNet50_Weights.DEFAULT)
model.fc = nn.Linear(model.fc.in_features, 2)  # 二分类:COVID/正常

# 图像预处理
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

# 预测
image = Image.open('xray.jpg')
input_tensor = transform(image).unsqueeze(0)  # unsqueeze增加一个维度
output = model(input_tensor)
prediction = torch.argmax(output, dim=1).item()  # 将单元素张量转为Python数值

print(f"诊断结果: {'COVID-19' if prediction == 1 else '正常'}")

1.2.4 安防监控

应用场景: - 人脸识别(门禁、考勤) - 行为分析(异常检测) - 人流统计 - 车牌识别 - 视频摘要

技术挑战: - 大规模数据(百万级人脸库) - 实时处理(多路视频流) - 隐私保护 - 抗干扰(光照、遮挡)

1.2.5 工业制造

应用场景: - 缺陷检测:表面缺陷、装配错误 - 尺寸测量:精密测量、质量控制 - 机器人视觉:抓取、装配、焊接 - 3D检测:深度测量、形状分析

案例:PCB缺陷检测

Python
import cv2
import numpy as np

def detect_defects(image):
    """检测PCB板缺陷"""
    # 转换为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 二值化
    _, binary = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)

    # 形态学操作
    kernel = np.ones((3, 3), np.uint8)
    opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

    # 边缘检测
    edges = cv2.Canny(opening, 50, 150)

    # 查找轮廓
    contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    defects = []
    for contour in contours:
        area = cv2.contourArea(contour)
        if area > 100:  # 阈值过滤
            x, y, w, h = cv2.boundingRect(contour)
            defects.append((x, y, w, h))

    return defects

# 使用
image = cv2.imread('pcb.jpg')
defects = detect_defects(image)
print(f"检测到 {len(defects)} 个缺陷")

1.2.6 电商零售

应用场景: - 商品识别(拍照购物) - 虚拟试衣 - 智能推荐 - 库存管理 - 无人零售

1.2.7 文娱创意

应用场景: - 滤镜特效:美颜、风格化 - 内容生成:AI绘画、视频生成 - 游戏:姿态估计、表情识别 - 影视制作:特效、后期处理


1.3 数学基础

1.3.1 线性代数

向量和矩阵

图像本质上是矩阵:

Text Only
灰度图像: H × W 矩阵
彩色图像: H × W × 3 张量

矩阵运算

Python
import numpy as np

# 图像表示
image = np.random.randint(0, 256, (100, 100, 3), dtype=np.uint8)

# 矩阵乘法(卷积的基础)
A = np.array([[1, 2], [3, 4]])  # np.array创建NumPy数组
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B)  # 或 A @ B

# 特征值和特征向量(PCA的基础)
eigenvalues, eigenvectors = np.linalg.eig(A)  # np.linalg线性代数运算

重要概念: - 卷积:图像滤波的核心操作 - 特征值分解:PCA、SVD的基础 - 矩阵求导:反向传播的基础

1.3.2 概率论与统计

概率分布

Python
import numpy as np
from scipy.stats import norm

# 高斯分布(噪声模型)
mu, sigma = 0, 1
x = np.linspace(-3, 3, 100)
pdf = norm.pdf(x, mu, sigma)

# 添加高斯噪声
image = np.random.randint(0, 256, (100, 100), dtype=np.uint8)
noise = np.random.normal(0, 25, image.shape).astype(np.uint8)
noisy_image = cv2.add(image, noise)

贝叶斯定理

Text Only
P(类别|图像) = P(图像|类别) × P(类别) / P(图像)

最大似然估计:模型训练的核心思想

1.3.3 微积分

导数和梯度

Python
import sympy as sp

# 符号计算
x = sp.symbols('x')
f = x**2 + 2*x + 1
df_dx = sp.diff(f, x)  # 求导
print(df_dx)  # 2*x + 2

# 数值梯度
def numerical_gradient(f, x, h=1e-5):
    return (f(x + h) - f(x - h)) / (2 * h)

链式法则:反向传播的核心

1.3.4 优化理论

梯度下降

Python
def gradient_descent(f, df, x0, learning_rate=0.01, max_iter=1000):
    """梯度下降算法"""
    x = x0
    for i in range(max_iter):
        gradient = df(x)
        x = x - learning_rate * gradient
    return x

# 示例:最小化 f(x) = x^2
f = lambda x: x**2  # lambda匿名函数
df = lambda x: 2*x
x_opt = gradient_descent(f, df, x0=10)
print(f"最优解: {x_opt}")  # 接近0

优化方法: - SGD(随机梯度下降) - Adam(自适应学习率) - RMSprop


1.4 开发环境搭建

1.4.1 Python环境配置

步骤1:安装Anaconda

Bash
# 下载并安装Anaconda
# https://www.anaconda.com/products/distribution

步骤2:创建虚拟环境

Bash
# 创建环境
conda create -n cv python=3.9

# 激活环境
conda activate cv  # Linux/Mac
# 或
activate cv  # Windows

1.4.2 核心库安装

OpenCV

Bash
pip install opencv-python
pip install opencv-contrib-python  # 包含额外模块

NumPy

Bash
pip install numpy scipy

深度学习框架(二选一)

PyTorch(推荐):

Bash
# CPU版本
pip install torch torchvision torchaudio

# GPU版本(CUDA 11.7)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117

TensorFlow

Bash
pip install tensorflow

可视化工具

Bash
pip install matplotlib seaborn
pip install tensorboard

1.4.3 开发工具

Jupyter Lab

Bash
pip install jupyterlab
jupyter lab

VS Code: - 安装Python扩展 - 安装Jupyter扩展 - 配置代码格式化(Black)

1.4.4 第一个CV程序

Hello World:读取和显示图像

Python
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 方法1:使用OpenCV
def opencv_example():
    # 读取图像
    image = cv2.imread('example.jpg')

    # 检查是否成功
    if image is None:
        print("无法读取图像")
        return

    # 显示图像信息
    print(f"图像尺寸: {image.shape}")
    print(f"数据类型: {image.dtype}")

    # 显示图像
    cv2.imshow('Image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 方法2:使用Matplotlib
def matplotlib_example():
    # 读取图像(OpenCV读取是BGR,需要转换为RGB)
    image = cv2.imread('example.jpg')
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    # 显示图像
    plt.figure(figsize=(10, 8))
    plt.imshow(image_rgb)
    plt.axis('off')
    plt.title('First CV Image')
    plt.show()

# 运行
if __name__ == '__main__':
    opencv_example()
    matplotlib_example()

运行结果

Text Only
图像尺寸: (480, 640, 3)
数据类型: uint8


1.5 实战案例:图像基本信息分析

案例描述

创建一个工具,分析图像的基本信息,包括尺寸、通道、像素分布等。

完整代码

Python
import cv2
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path

class ImageAnalyzer:
    """图像分析工具类"""

    def __init__(self, image_path):
        self.image_path = image_path
        self.image = None
        self.gray_image = None
        self.load_image()

    def load_image(self):
        """加载图像"""
        self.image = cv2.imread(self.image_path)
        if self.image is None:
            raise ValueError(f"无法加载图像: {self.image_path}")
        self.gray_image = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)

    def get_basic_info(self):
        """获取基本信息"""
        height, width, channels = self.image.shape
        total_pixels = height * width

        info = {
            '文件路径': self.image_path,
            '图像尺寸': f"{width}x{height}",
            '通道数': channels,
            '总像素数': total_pixels,
            '数据类型': str(self.image.dtype),
            '文件大小': f"{Path(self.image_path).stat().st_size / 1024:.2f} KB"
        }
        return info

    def get_color_distribution(self):
        """获取颜色分布"""
        colors = ['B', 'G', 'R']
        distributions = {}

        for i, color in enumerate(colors):  # enumerate同时获取索引和元素
            hist = cv2.calcHist([self.image], [i], None, [256], [0, 256])
            distributions[color] = hist.flatten()

        return distributions

    def get_statistics(self):
        """获取统计信息"""
        stats = {
            '亮度均值': np.mean(self.gray_image),
            '亮度标准差': np.std(self.gray_image),
            '亮度最小值': np.min(self.gray_image),
            '亮度最大值': np.max(self.gray_image),
            '亮度中位数': np.median(self.gray_image)
        }
        return stats

    def visualize_info(self):
        """可视化信息"""
        fig, axes = plt.subplots(2, 2, figsize=(15, 12))

        # 原始图像
        image_rgb = cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)
        axes[0, 0].imshow(image_rgb)
        axes[0, 0].set_title('原始图像')
        axes[0, 0].axis('off')

        # 灰度图像
        axes[0, 1].imshow(self.gray_image, cmap='gray')
        axes[0, 1].set_title('灰度图像')
        axes[0, 1].axis('off')

        # 颜色直方图
        colors = ['b', 'g', 'r']
        for i, color in enumerate(colors):
            hist = cv2.calcHist([self.image], [i], None, [256], [0, 256])
            axes[1, 0].plot(hist, color=color, label=f'{color.upper()}通道')
        axes[1, 0].set_title('颜色直方图')
        axes[1, 0].set_xlabel('像素值')
        axes[1, 0].set_ylabel('像素数量')
        axes[1, 0].legend()

        # 灰度直方图
        axes[1, 1].hist(self.gray_image.ravel(), bins=256, color='gray')
        axes[1, 1].set_title('灰度直方图')
        axes[1, 1].set_xlabel('像素值')
        axes[1, 1].set_ylabel('像素数量')

        plt.tight_layout()
        plt.savefig('image_analysis.png', dpi=300, bbox_inches='tight')
        plt.show()

    def generate_report(self):
        """生成分析报告"""
        print("=" * 50)
        print("图像分析报告")
        print("=" * 50)

        # 基本信息
        print("\n【基本信息】")
        basic_info = self.get_basic_info()
        for key, value in basic_info.items():
            print(f"{key}: {value}")

        # 统计信息
        print("\n【统计信息】")
        stats = self.get_statistics()
        for key, value in stats.items():
            print(f"{key}: {value:.2f}")

        print("\n【可视化】")
        print("已生成图像分析可视化: image_analysis.png")

        print("\n" + "=" * 50)

# 使用示例
if __name__ == '__main__':
    # 创建测试图像
    test_image = np.random.randint(0, 256, (480, 640, 3), dtype=np.uint8)
    cv2.imwrite('test_image.jpg', test_image)

    # 分析图像
    analyzer = ImageAnalyzer('test_image.jpg')
    analyzer.generate_report()
    analyzer.visualize_info()

1.6 练习题

基础题

  1. 简答题
  2. 什么是计算机视觉?它与图像处理有什么区别?

    计算机视觉是让机器从图像/视频中"理解"内容并提取高层语义信息的学科。图像处理侧重于图像到图像的变换(如去噪、增强),输出仍是图像;计算机视觉侧重于图像到语义的理解,输出是分类、检测等决策结果。

  3. 列举计算机视觉的三个主要应用场景。

    ①自动驾驶(车道检测、障碍物识别);②医学影像分析(病灶检测、辅助诊断);③安防监控(人脸识别、异常行为检测)。

  4. 选择题

  5. 以下哪项不是计算机视觉的任务? a) 图像分类 b) 目标检测 c) 数据库管理 d) 图像分割

    答案:c) 数据库管理。图像分类、目标检测、图像分割都是CV核心任务,数据库管理属于数据管理领域。

  6. 计算题

  7. 一张分辨率为1920×1080的RGB图像,每个像素8位,计算其文件大小(未压缩)。

    文件大小 = 1920 × 1080 × 3(通道)× 1(字节/通道)= 6,220,800 字节 ≈ 5.93 MB。

进阶题

  1. 编程题
  2. 编写一个Python程序,读取图像并显示其R、G、B三个通道的图像。

  3. 思考题

  4. 为什么深度学习在计算机视觉领域取得了巨大成功?

    主要原因:①大规模标注数据集(如ImageNet)的出现;②GPU等硬件算力的提升;③深度网络能自动学习层次化特征(从低层边缘到高层语义),避免了手工设计特征的局限;④端到端训练大幅简化流程。

  5. 计算机视觉面临的主要挑战是什么?

    主要挑战:①数据标注成本高且存在长尾分布;②模型泛化能力有限,域迁移困难;③实时性要求与模型复杂度矛盾;④模型可解释性不足(黑盒问题);⑤对抗攻击下的鲁棒性问题。

挑战题

  1. 项目题
  2. 实现一个简单的图像浏览器,支持缩放、旋转等基本操作。

1.7 面试准备

大厂面试题

Q1: 什么是计算机视觉?它与图像处理有什么区别?

参考答案: - 计算机视觉:让机器"理解"图像内容,提取高层语义信息 - 图像处理:对图像进行变换和增强,改善视觉效果 - 区别: - 图像处理:输入图像→输出图像(低层) - 计算机视觉:输入图像→输出理解/决策(高层)

Q2: 计算机视觉的主要任务有哪些?

参考答案: - 图像分类:识别图像中的主要对象 - 目标检测:定位和识别图像中的多个对象 - 语义分割:像素级别的分类 - 实例分割:区分同一类别的不同实例 - 图像生成:从文本或噪声生成图像 - 视频分析:动作识别、目标跟踪

Q3: 你认为计算机视觉面临的最大挑战是什么?

参考答案: - 数据问题:标注成本高、数据不平衡 - 泛化能力:模型在新场景下的表现 - 实时性:复杂模型的推理速度 - 可解释性:深度学习的黑盒特性 - 鲁棒性:对抗攻击、噪声干扰

Q4: 介绍一下你熟悉的计算机视觉项目

参考答案模板

Text Only
项目背景:解决什么问题
技术方案:使用什么技术(算法、框架)
实现细节:关键技术点
项目成果:性能指标、业务价值
遇到的挑战:如何解决

算法题

LeetCode相关题目: - 旋转图像(48) - 图像平滑器(661) - 转置矩阵(867)

系统设计题

设计一个实时视频监控系统

关键点: - 架构设计(边缘计算 vs 云端) - 模型选择(速度 vs 精度) - 数据流处理 - 异常检测 - 告警机制


1.8 本章小结

核心知识点

  1. 计算机视觉定义:让机器"看"的科学
  2. 发展历史:从传统算法到深度学习
  3. 任务分类:低层、中层、高层视觉
  4. 应用场景:消费电子、自动驾驶、医疗、安防等
  5. 数学基础:线性代数、概率论、微积分、优化
  6. 开发环境:Python、OpenCV、PyTorch/TensorFlow

下一步

完成本章后,你应该: - [ ] 理解计算机视觉的基本概念 - [ ] 了解CV的应用场景 - [ ] 搭建好开发环境 - [ ] 运行第一个CV程序 - [ ] 完成图像分析实战案例

下一章02-图像处理基础.md - 学习图像处理的基本操作


1.9 扩展阅读

推荐论文

  1. AlexNet (2012): "ImageNet Classification with Deep Convolutional Neural Networks"
  2. VGG (2014): "Very Deep Convolutional Networks for Large-Scale Image Recognition"
  3. ResNet (2015): "Deep Residual Learning for Image Recognition"

推荐书籍

  1. 《Computer Vision: Algorithms and Applications》- Richard Szeliski
  2. 《Deep Learning》- Ian Goodfellow(第5章)

在线资源

  1. CS231n - Stanford计算机视觉课程
  2. OpenCV官方文档 - https://docs.opencv.org/
  3. Papers with Code - https://paperswithcode.com/

恭喜完成第1章! 🎉

你已经迈出了计算机视觉学习的第一步。继续加油!