跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

计算机视觉基础与实战应用

计算机视觉作为人工智能的关键分支,旨在让机器理解图像内容。本文系统梳理了从图像预处理、特征提取到深度学习模型训练的全流程技术。涵盖 OpenCV 图像处理、HOG/SIFT/ORB 特征方法,以及 ResNet、YOLO 等主流架构。通过 PyTorch 实战项目演示了图像分类与目标检测的应用开发,帮助读者掌握从理论到落地的完整技能链,具备独立构建计算机视觉系统的能力。

Stephaine Walsh发布于 2026/3/21更新于 2026/9/350 浏览
计算机视觉基础与实战应用

计算机视觉的基础与应用

计算机视觉示意图

核心目标

  • 理解计算机视觉的基本概念及其在 AI 领域的重要性
  • 掌握图像处理、特征提取及常用模型架构的核心技术
  • 学会使用 OpenCV、PyTorch 等工具进行图像分析与模型训练
  • 通过实战项目,独立完成图像分类、目标检测等应用开发

一、计算机视觉基础

基本概念与重要性

计算机视觉(Computer Vision)致力于让计算机像人类一样理解和解释图像内容。其核心价值在于:

  1. 图像理解:识别物体、场景和动作
  2. 目标检测:定位并识别图像中的特定物体
  3. 图像分类:对图像内容进行标签化归类
  4. 语义分割:像素级的图像区域标记
  5. 图像生成:基于数据创造新的图像内容

应用场景与挑战

从医疗影像分析到自动驾驶,再到安防监控,计算机视觉已渗透至多个行业。但在实际落地中,我们常面临图像噪声、光照变化、物体多样性以及计算资源限制等挑战。

二、图像处理技术

预处理与增强

图像预处理是后续分析的基石。常见的操作包括读取保存、尺寸调整、裁剪旋转以及亮度对比度调节。对于图像质量提升,直方图均衡化和各类滤波(均值、高斯、中值)能有效去除噪声并增强对比度。

import cv2
import numpy as np

def read_image(image_path):
    image = cv2.imread(image_path)
    return image

def save_image(image, output_path):
    cv2.imwrite(output_path, image)

def resize_image(image, width, height):
    resized_image = cv2.resize(image, (width, height))
    return resized_image

def adjust_brightness_contrast(image, alpha=1.0, beta=0.0):
    adjusted_image = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)
    return adjusted_image

 ():
    cropped_image = image[y:y+height, x:x+width]
     cropped_image

 ():
    (h, w) = image.shape[:]
    center = (w // , h // )
    M = cv2.getRotationMatrix2D(center, angle, )
    rotated_image = cv2.warpAffine(image, M, (w, h))
     rotated_image
def
crop_image
image, x, y, width, height
return
def
rotate_image
image, angle
2
2
2
1.0
return

在增强方面,我们可以通过直方图均衡化改善对比度,或使用高斯滤波平滑噪声。边缘检测则是提取轮廓的关键,Sobel 算子和 Canny 算法最为常用。

import cv2
import numpy as np

def histogram_equalization(image):
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    equalized_image = cv2.equalizeHist(gray_image)
    return equalized_image

def mean_filter(image, kernel_size=3):
    blurred_image = cv2.blur(image, (kernel_size, kernel_size))
    return blurred_image

def gaussian_filter(image, kernel_size=3, sigma=0):
    blurred_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigma)
    return blurred_image

def median_filter(image, kernel_size=3):
    blurred_image = cv2.medianBlur(image, kernel_size)
    return blurred_image

def sobel_edge_detection(image):
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    sobel_x = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=3)
    sobel_y = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=3)
    sobel_combined = np.sqrt(sobel_x**2 + sobel_y**2)
    sobel_combined = np.uint8(sobel_combined / np.max(sobel_combined) * 255)
    return sobel_combined

def canny_edge_detection(image, threshold1=100, threshold2=200):
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray_image, threshold1, threshold2)
    return edges

三、特征提取方法

传统特征提取依然在某些场景下有效。HOG(方向梯度直方图)擅长描述形状,SIFT(尺度不变特征变换)对旋转缩放具有鲁棒性,而 ORB 则在速度上表现优异。

import cv2
import numpy as np

def extract_hog_features(image):
    hog = cv2.HOGDescriptor()
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    features = hog.compute(gray_image)
    return features

def extract_sift_features(image):
    sift = cv2.SIFT_create()
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    keypoints, descriptors = sift.detectAndCompute(gray_image, None)
    return keypoints, descriptors

def extract_orb_features(image):
    orb = cv2.ORB_create()
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    keypoints, descriptors = orb.detectAndCompute(gray_image, None)
    return keypoints, descriptors

四、常用模型与架构

从早期的 LeNet 到经典的 AlexNet、VGG,再到解决梯度消失的 ResNet 以及实时检测的 YOLO,深度学习模型不断演进。传统机器学习如 SVM、决策树和随机森林也可用于简单的图像分类任务。

PyTorch 模型训练实战

以 ResNet 为例,我们可以利用迁移学习快速构建分类器。关键在于数据增强、损失函数选择以及优化器的调度。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms, models

def train_resnet_model(data_dir, num_classes=2, batch_size=32, num_epochs=10, lr=0.001):
    # 数据预处理
    data_transforms = {
        'train': transforms.Compose([
            transforms.RandomResizedCrop(224),
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ]),
        'val': 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_datasets = {x: datasets.ImageFolder(f'{data_dir}/{x}', data_transforms[x]) for x in ['train', 'val']}
    dataloaders = {x: DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=4) for x in ['train', 'val']}
    dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
    class_names = image_datasets['train'].classes
    
    # 加载模型
    model = models.resnet18(pretrained=True)
    num_ftrs = model.fc.in_features
    model.fc = nn.Linear(num_ftrs, num_classes)
    
    # 定义损失函数和优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=lr, momentum=0.9)
    scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)
    
    # 训练模型
    for epoch in range(num_epochs):
        print(f'Epoch {epoch}/{num_epochs -1}')
        print('-'*10)
        for phase in ['train', 'val']:
            if phase == 'train':
                model.train()
            else:
                model.eval()
            running_loss = 0.0
            running_corrects = 0
            for inputs, labels in dataloaders[phase]:
                optimizer.zero_grad()
                with torch.set_grad_enabled(phase == 'train'):
                    outputs = model(inputs)
                    _, preds = torch.max(outputs, 1)
                    loss = criterion(outputs, labels)
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()
                running_loss += loss.item() * inputs.size(0)
                running_corrects += torch.sum(preds == labels.data)
            if phase == 'train':
                scheduler.step()
            epoch_loss = running_loss / dataset_sizes[phase]
            epoch_acc = running_corrects.double() / dataset_sizes[phase]
            print(f'{phase} Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')
    print('Training complete')
    return model

五、实战项目:计算机视觉应用开发

系统设计与实现

我们要构建一个支持图像分类和目标检测的桌面应用。架构上分为用户界面、业务逻辑、图像处理和数据存储层。开发环境需安装 OpenCV、PIL、PyTorch 等库。

pip install opencv-python
pip install pillow
pip install torch torchvision
pip install tensorflow

核心功能代码

界面部分采用 Tkinter 搭建,包含图像上传、功能选择和结果展示模块。分类与检测逻辑则封装为独立函数,便于调用。

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

class ImageInputFrame(tk.Frame):
    def __init__(self, parent, on_image_selected):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.on_image_selected = on_image_selected
        self.create_widgets()

    def create_widgets(self):
        self.image_label = tk.Label(self)
        self.image_label.pack(pady=10, padx=10, fill="both", expand=True)
        tk.Button(self, text="选择图像", command=self.select_image).pack(pady=10, padx=10)

    def select_image(self):
        file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png *.jpg *.jpeg *.bmp")])
        if file_path:
            image = Image.open(file_path)
            image = image.resize((400, 300), Image.ANTIALIAS)
            photo = ImageTk.PhotoImage(image)
            self.image_label.configure(image=photo)
            self.image_label.image = photo
            self.on_image_selected(file_path)

分类功能利用预训练的 ResNet 模型,输入路径后返回预测类别。

import torch
from torchvision import transforms, models
from PIL import Image

def classify_image(image_path, model_path, class_names):
    data_transforms = 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(image_path)
    image = data_transforms(image)
    image = image.unsqueeze(0)
    model = models.resnet18()
    num_ftrs = model.fc.in_features
    model.fc = torch.nn.Linear(num_ftrs, len(class_names))
    model.load_state_dict(torch.load(model_path))
    model.eval()
    with torch.no_grad():
        outputs = model(image)
        _, preds = torch.max(outputs, 1)
    return class_names[preds[0]]

目标检测则使用 Faster R-CNN,绘制边界框并标注置信度。

import cv2
import numpy as np
import torch
from torchvision import transforms, models
from PIL import Image

def detect_objects(image_path, model_path, class_names):
    image = cv2.imread(image_path)
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image_pil = Image.fromarray(image_rgb)
    data_transforms = transforms.Compose([
        transforms.Resize((416, 416)),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ])
    image_tensor = data_transforms(image_pil)
    image_tensor = image_tensor.unsqueeze(0)
    model = models.detection.fasterrcnn_resnet50_fpn(pretrained=False)
    in_features = model.roi_heads.box_predictor.cls_score.in_features
    model.roi_heads.box_predictor = models.detection.faster_rcnn.FastRCNNPredictor(in_features, len(class_names))
    model.load_state_dict(torch.load(model_path))
    model.eval()
    with torch.no_grad():
        outputs = model(image_tensor)
    boxes = outputs[0]['boxes'].cpu().numpy()
    scores = outputs[0]['scores'].cpu().numpy()
    labels = outputs[0]['labels'].cpu().numpy()
    for i in range(len(boxes)):
        if scores[i] > 0.5:
            box = boxes[i].astype(int)
            label = class_names[labels[i]]
            score = scores[i]
            cv2.rectangle(image, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2)
            cv2.putText(image, f"{label}: {score:.2f}", (box[0], box[1]-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
    return image

主程序整合了上述模块,提供图形化交互入口,运行 cv_app.py 即可启动应用。

六、总结

本文系统梳理了计算机视觉的技术栈,从底层的图像预处理到高层的深度学习模型,再到完整的工程化落地。掌握这些知识,不仅能理解机器如何'看'世界,更能亲手构建具备感知能力的智能系统。

目录

  1. 计算机视觉的基础与应用
  2. 核心目标
  3. 一、计算机视觉基础
  4. 基本概念与重要性
  5. 应用场景与挑战
  6. 二、图像处理技术
  7. 预处理与增强
  8. 三、特征提取方法
  9. 四、常用模型与架构
  10. PyTorch 模型训练实战
  11. 五、实战项目:计算机视觉应用开发
  12. 系统设计与实现
  13. 核心功能代码
  14. 六、总结

更多推荐文章

查看全部
  • 利用 AIGC 与 Photoshop 快速生成 Spine 2D 骨骼动画拆件 PSD
  • Hugging Face:不仅是 AI 的 GitHub,更是开发者的开源生态家园
  • 互联网产品经理转型大模型 AI 产品经理实战指南
  • 2026 高校 AIGC 检测新规:AI 率合格标准详解
  • AI Agent 框架技术选型:OpenClaw 生态 18 大分支解析
  • Flutter 跨平台 Web 认证插件 flutter_web_auth_2 适配 OpenHarmony 详解
  • OpenClaw 本地部署与 AI Agent 开发指南
  • Z-Image Turbo 本地部署与使用指南
  • FPGA 时序逻辑实战:计数器、跨时钟域与状态机解析
  • WebDriverAgent 技术深度解析
  • 100倍提速!OpenAI Consistency Model终结AI绘画等待时代
  • OpenClaw 入门指南:AI Agent 本地部署与实践
  • ASP.NET Core Razor Pages 从零搭建入门指南
  • FPGA 摄像头采集处理显示指南:OV5640 至 HDMI 实时实现
  • 深入解析 AI 中的 Skills:机制、对比与应用场景
  • 渐进式 AIGC 系统:多模态大模型私有化部署与智能体开发实战
  • 基于 SpringBoot 与 Vue 的高校实习生管理平台设计与实现
  • Copilot的Plan模式到底好在哪?
  • 面向复杂路口的 Apollo 决策算法语义理解模块设计与仿真
  • OpenClaw Dashboard 无法登录:systemd 缺失导致 Gateway 未启动

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online