OpenCV 作为计算机视觉领域的经典库,为图像处理提供了丰富的工具集。本文基于实际代码示例,不仅会详解基础操作,还会深入分析每个功能的原理与应用场景,帮你从 “会用” 到 “理解”,轻松入门图像处理。


一、图像的读取与显示

图像在计算机中以像素矩阵形式存在,每个像素点的颜色由数值表示。OpenCV 提供了简洁的接口让我们与这个像素世界交互。

核心操作代码

import cv2

# 读取图像(默认彩色模式)
img = cv2.imread('img_1.jpg')
# 显示图像:窗口名称 + 图像数据
cv2.imshow('Original Image', img)
# 等待用户操作:0表示无限等待,按下任意键继续
cv2.waitKey(0)
# 清理资源:关闭所有窗口
cv2.destroyAllWindows()

关键知识点

  • 图像的本质:打印 img.shape 会得到 (高度, 宽度, 通道数),例如 (480, 640, 3) 表示图像高 480 像素、宽 640 像素,3 个颜色通道(OpenCV 默认顺序为 BGR,而非 RGB)。
  • 数据类型img.dtype 通常为 uint8(0-255 的整数),这是因为人眼对亮度的感知在这个范围内最敏感。
  • 图像大小img.size 计算总像素数(高度 × 宽度 × 通道数),可快速判断图像占用内存(总像素 ×1 字节,约 480×640×3=921,600 字节 ≈ 0.9MB)。

二、灰度图处理

灰度图通过单通道(0-255)表示亮度,能减少计算量,是许多高级处理(如边缘检测)的前置步骤。

核心操作代码

# 读取灰度图(参数0等价于cv2.IMREAD_GRAYSCALE)
gray_img = cv2.imread('img_1.jpg', 0)
# 显示并保存
cv2.imshow('Gray Image', gray_img)
cv2.waitKey(10000)  # 10秒后自动关闭
cv2.imwrite('img_1_gray.jpg', gray_img)  # 保存处理结果
cv2.destroyAllWindows()

实战价值

  • 文件体积:灰度图仅为彩色图的 1/3 大小,适合快速传输与存储。
  • 特征提取:去除色彩干扰后,轮廓、纹理等特征更易识别(例如身份证识别中先转灰度图再提取文字)。

三、图像切片

像切蛋糕一样截取图像的部分区域,是处理局部特征的基础。

核心操作代码

img = cv2.imread('img_1.jpg')
# 切片语法:[起始行:结束行, 起始列:结束列](对应图像的高和宽)
cropped = img[0:500, 100:300]  # 截取从顶部0-500行、左100-300列的区域
cv2.imshow('Original', img)
cv2.imshow('Cropped', cropped)
cv2.waitKey(0)
cv2.destroyAllWindows()

应用场景

  • 目标裁剪:从合影中截取单人头像。
  • 局部分析:放大图像中的细节(如验证码的字符区域)。

四、视频处理

视频本质是连续的图像帧,OpenCV 可逐帧读取并处理,实现实时特效。

核心操作代码

# 打开视频文件(参数为0时调用摄像头)
video = cv2.VideoCapture('DSC01703.mp4')

if not video.isOpened():
    print("无法打开视频")
    exit()

while True:
    # 逐帧读取:ret(是否成功),frame(当前帧图像)
    ret, frame = video.read()
    if not ret:  # 读取完毕或出错
        break
    
    # 实时处理:例如转为灰度图(取消注释即可生效)
    # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    cv2.imshow('Video', frame)
    # 60ms刷新一帧,按下ESC键(ASCII 27)退出
    if cv2.waitKey(60) == 27:
        break

# 释放资源(必做!否则可能占用摄像头/文件句柄)
video.release()
cv2.destroyAllWindows()

进阶思路

  • 帧率控制waitKey(60) 对应约 16fps(1000/60≈16),可根据视频实际帧率调整。
  • 实时特效:在循环中添加模糊、边缘检测等操作,实现类似直播滤镜的效果。

五、颜色通道

OpenCV 中图像默认以 BGR 通道存储,掌握通道操作可实现多彩特效。

1. 通道分离与显示

img = cv2.imread('img_1.jpg')
# 方法1:数组切片
b = img[:, :, 0]  # 蓝色通道
g = img[:, :, 1]  # 绿色通道
r = img[:, :, 2]  # 红色通道

# 方法2:cv2.split()(更高效)
b, g, r = cv2.split(img)

# 显示单通道(灰度显示,因缺少其他通道信息)
cv2.imshow('Blue Channel', b)
cv2.imshow('Green Channel', g)
cv2.imshow('Red Channel', r)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 单通道彩色显示

若想单独显示某一颜色(如纯蓝色),需将其他通道置为 0:

img = cv2.imread('img_1.jpg')
blue_only = img.copy()
blue_only[:, :, 1] = 0  # 关闭绿色通道
blue_only[:, :, 2] = 0  # 关闭红色通道
cv2.imshow('Only Blue', blue_only)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 通道合并

分离后的通道可重新组合为完整图像:

b, g, r = cv2.split(img)
merged = cv2.merge((b, g, r))  # 注意顺序必须与分离一致
cv2.imshow('Merged Image', merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

应用案例

  • 证件照换底色:通过分离通道,调整蓝色 / 红色通道阈值实现背景替换。
  • 色彩增强:单独提高绿色通道亮度,让植物照片更鲜艳。

六、图像修改

1. 图片打码

通过随机像素覆盖敏感区域:

import numpy as np

img = cv2.imread('img_1.jpg')
# 打码区域:行100-200,列200-300(大小100×100)
# 生成同尺寸随机像素(0-255,3通道)
img[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))
cv2.imshow('Blurred Area', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:赋值区域的尺寸必须与随机数组完全匹配(此处均为 100×100×3)。

2. 图像拼接

将一张图像的部分区域 “粘贴” 到另一张图像

img1 = cv2.imread('img_1.jpg')
img2 = cv2.imread('img_2.jpg')
# 将img1的[50:80, 100:150]区域复制到img2的[20:50, 100:150]
# 注意:两个区域尺寸必须相同(30行×50列)
img2[20:50, 100:150] = img1[50:80, 100:150]
cv2.imshow('Combined', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

七、图像缩放

cv2.resize() 支持两种缩放方式,满足不同场景需求。

核心操作代码

img = cv2.imread('img_1.jpg')
# 方法1:指定目标尺寸(宽, 高)
resized1 = cv2.resize(img, (200, 600))  # 宽200,高600

# 方法2:指定缩放系数(fx: 宽缩放,fy: 高缩放)
resized2 = cv2.resize(img, None, fx=2, fy=2)  # 宽高均放大2倍

cv2.imshow('Original', img)
cv2.imshow('Resized by Size', resized1)
cv2.imshow('Resized by Scale', resized2)
cv2.waitKey(0)
cv2.destroyAllWindows()

技术细节

  • 尺寸参数dsize=(宽, 高) 与图像 shape=(高, 宽, 3) 的顺序相反,需注意避免混淆。
  • 缩放算法:默认使用双线性插值,可通过 interpolation 参数指定(如 cv2.INTER_NEAREST 速度更快,cv2.INTER_CUBIC 质量更高)。

总结

本文涵盖了 OpenCV 图像处理的核心基础:从图像的读取显示、灰度转换,到区域截取、视频处理,再到通道操作、创意修改与尺寸调整。这些操作看似简单,却是实现复杂视觉任务(如目标检测、人脸识别)的基石。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐