OpenCV实战:基础操作
本文涵盖了 OpenCV 图像处理的核心基础:从图像的读取显示、灰度转换,到区域截取、视频处理,再到通道操作、创意修改与尺寸调整。这些操作看似简单,却是实现复杂视觉任务(如目标检测、人脸识别)的基石。
·
文章目录
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 图像处理的核心基础:从图像的读取显示、灰度转换,到区域截取、视频处理,再到通道操作、创意修改与尺寸调整。这些操作看似简单,却是实现复杂视觉任务(如目标检测、人脸识别)的基石。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)