一个开源的计算机视觉和机器学习库。支持Python和C++语法,可用于图像和视频处理,库里含数百个优化算法,涵盖了计算机视觉和图像处理的多个方面。
- 图像处理:图像滤波、边缘检测、颜色空间转换、形态学操作、特征提取等。
- 视频分析:视频捕捉、运动分析、物体检测与追踪等。
- 机器学习与人工智能:OpenCV集成了深度学习框架,可以进行人脸识别、目标检测、图像分类等。
- 计算机视觉:图像匹配、物体识别、立体视觉、深度图计算等。
1.安装(Python3.x)
pip install opencv-python
如果需要额外的模块(例如 contrib 模块),可以安装 opencv-contrib-python:
pip install opencv-contrib-python
该版本包括更多模块和功能。
用OpenCV完成一次图像读写。对单张图片的操作包括读取、显示、保存。
#导入Opencv库
import cv2
#读取图片
image_path = "C:/PythonCode/test001.png"
img = cv2.imread(image_path)
#检查读取是否成功
if img is None:
print("Error")
exit()
#显示图偏
cv2.imshow("display Image",img)
#等待用户按键输入,0表示无限等待,直到用户按任意键
key = cv2.waitKey(0)
#执行按键,当按下s键保存,其他键不保存
if key == ord('s'): # 如果按下 's' 键
# 保存图像
output_path = "C:/Users/罗翔/Downloads/saved_image.jpg"
cv2.imwrite(output_path, img)
print(f"图像已保存为 {output_path}")
else: # 如果按下其他键
print("图像未保存。")
#关闭窗口
cv2.destroyAllWindows()
模块名 | 描述 |
cv2.core | 核心模块,包含了图像处理的基础功能(如图像数组的表示和操作)。 |
cv2.imgproc | 图像处理模块,提供图像的各种操作,如滤波、图像变换、形态学操作等。 |
cv2.highgui | 图形用户界面模块,提供显示图像和视频的功能。 |
cv2.video | 提供视频处理的功能,如视频捕捉、视频流的处理等。 |
cv2.features2d | 特征检测与匹配模块,包含了角点、边缘、关键点检测等。 |
cv2.ml | 机器学习模块,提供了多种机器学习算法,可以进行图像分类、回归、聚类等。 |
cv2.calib3d | 相机校准和 3D 重建模块。 |
cv2.objdetect | 目标检测模块。 |
cv2.dnn | 深度学习模块。 |
2.图像处理基础
可以把图像理解为二维数组,每个图像就是一个多维数组,每个元素对应图像中一个像素。图像的尺寸和颜色模式也可以通过数组的形状来表示。OpenCV通过Numpy数组表示图像数据。
图像基本属性:
- 尺寸(Width,Height):通过img.shape获取。
- 颜色通道(Channels):通常RGB三个通道,也有单通道灰度图。
- 数据类型(Data type):常见有uint8(0-255),也可以是float32或其他。
功能 | 函数 | 示例 |
读取图像 | cv2.imread( ) | img = cv2.imread('image.jpg'),img存储一个Numpy数组,图片不存在返回None。 |
显示图像 | cv2.imshow( ) | cv2.imshow("Display Window",image) |
等待按键输入 | cv2.waitKey(0) | |
关闭所有窗口 | cv2.destroyAllWindows() | |
保存图像 | cv2.imwrite( ) | cv2.imwrite("output_image.jpg",image) |
图像操作 | ||
获取像素值 | image[start,end] | pixel = image[100, 100] # 获取 (100, 100) 处的像素值 |
修改像素值 | image[start,end]=[r,g,b] | image[100, 100] = [255, 255, 255] # 将 (100, 100) 处的像素设置为白色 |
获取ROI | image[start1:end1,start2:end2] | roi = image[50:150, 50:150] # 获取 (50,50) 到 (150,150) 的区域 |
修改ROI | image[start1:end1,start2:end2]=[R,G,B] | image[50:150, 50:150] = [0, 255, 0] # 将 ROI 区域设置为绿色 |
分离通道 | cv2.split() | b, g, r = cv2.split(image) |
合并通道 | cv2.merge([b,g,r]) | merged_image = cv2.merge([b, g, r]) |
另一些基本操作方法
操作 | 函数/方法 | 说明 |
---|---|---|
访问像素值 | image[y, x] |
获取或修改像素值。 |
图像 ROI | image[y1:y2, x1:x2] |
获取或修改图像中的矩形区域。 |
通道分离与合并 | cv2.split() / cv2.merge() |
分离或合并图像通道。 |
图像缩放 | cv2.resize() |
调整图像大小。 |
图像旋转 | cv2.getRotationMatrix2D() |
旋转图像。 |
图像平移 | cv2.warpAffine() |
平移图像。 |
图像翻转 | cv2.flip() |
翻转图像。 |
图像加法 | cv2.add() |
对两幅图像进行加法运算。 |
图像减法 | cv2.subtract() |
对两幅图像进行减法运算。 |
图像混合 | cv2.addWeighted() |
对两幅图像进行加权混合。 |
阈值处理 | cv2.threshold() |
对图像进行阈值处理。 |
平滑处理 | cv2.blur() / cv2.GaussianBlur() |
对图像进行平滑处理。 |
图像位运算 |
||
按位与操作 | cv2.bitwise_and() |
掩码操作、图像分割 |
按位或操作 | cv2.bitwise_or() |
图像叠加 |
按位取反操作 | cv2.bitwise_not() |
图像反色 |
按位异或操作 | cv2.bitwise_xor() |
图像差异检测 |
3.图像形态学操作
图像形态学操作是图像处理中的一种重要技术,主要用于处理二值图像(即黑白图像)。
操作 | 函数 | 说明 | 应用场景 |
---|---|---|---|
腐蚀 | cv2.erode() |
用结构元素扫描图像,如果结构元素覆盖的区域全是前景,则保留中心像素。 | 去除噪声、分离物体。 |
膨胀 | cv2.dilate() |
用结构元素扫描图像,如果结构元素覆盖的区域存在前景,则保留中心像素。 | 连接断裂的物体、填充空洞。 |
开运算 | cv2.morphologyEx() |
先腐蚀后膨胀。 | 去除小物体、平滑物体边界。 |
闭运算 | cv2.morphologyEx() |
先膨胀后腐蚀。 | 填充小孔洞、连接邻近物体。 |
形态学梯度 | cv2.morphologyEx() |
膨胀图减去腐蚀图。 | 提取物体边缘。 |
顶帽运算 | cv2.morphologyEx() |
原图减去开运算结果。 | 提取比背景亮的细小物体。 |
黑帽运算 | cv2.morphologyEx() |
闭运算结果减去原图。 | 提取比背景暗的细小物体。 |
4. 图像边缘检测
图像边缘检测是计算机视觉和图像处理中的一项基本任务,它用于识别图像中亮度变化明显的区域,这些区域通常对应于物体的边界。
是 OpenCV 中常用的边缘检测函数及其说明:
函数 | 算法 | 说明 | 适用场景 |
---|---|---|---|
cv2.Canny() |
Canny 边缘检测 | 多阶段算法,检测效果较好,噪声抑制能力强。 | 通用边缘检测,适合大多数场景。 |
cv2.Sobel() |
Sobel 算子 | 基于一阶导数的边缘检测,可以检测水平和垂直边缘。 | 检测水平和垂直边缘。 |
cv2.Scharr() |
Scharr 算子 | Sobel 算子的改进版本,对边缘的响应更强。 | 检测细微的边缘。 |
cv2.Laplacian() |
Laplacian 算子 | 基于二阶导数的边缘检测,对噪声敏感。 | 检测边缘和角点。 |
5.图像轮廓检测
轮廓检测是图像处理中的重要任务,用于提取图像中物体的边界。
OpenCV 提供了强大的轮廓检测功能,可以用于物体识别、形状分析、目标跟踪等应用。以下是 OpenCV 图像轮廓检测的详细说明。
轮廓检测的基本概念
轮廓: 图像中物体的边界,由一系列点组成。
轮廓层次结构: 轮廓之间的嵌套关系,例如一个轮廓是否包含另一个轮廓。
轮廓特征: 轮廓的面积、周长、边界矩形、最小外接矩形、最小外接圆等。
轮廓检测常用函数
函数名称 | 功能描述 |
---|---|
cv2.findContours() |
查找图像中的轮廓 |
cv2.drawContours() |
在图像上绘制轮廓 |
cv2.contourArea() |
计算轮廓的面积 |
cv2.arcLength() |
计算轮廓的周长或弧长 |
cv2.boundingRect() |
计算轮廓的边界矩形 |
cv2.minAreaRect() |
计算轮廓的最小外接矩形 |
cv2.minEnclosingCircle() |
计算轮廓的最小外接圆 |
cv2.approxPolyDP() |
对轮廓进行多边形近似 |
轮廓检测的应用
- 物体识别: 通过轮廓检测可以识别图像中的物体,例如检测圆形、矩形等。
- 形状分析: 通过计算轮廓的特征(如面积、周长、边界矩形等),可以分析物体的形状。
- 目标跟踪: 在视频中,可以通过轮廓检测跟踪运动的目标。
- 图像分割: 通过轮廓检测可以将图像中的物体分割出来。
OpenCV 提供了强大的轮廓检测功能,可以用于提取图像中物体的边界,并计算轮廓的特征。
以下是轮廓检测的主要步骤和函数:
步骤 | 函数 | 说明 |
---|---|---|
图像预处理 | cv2.cvtColor() |
将图像转换为灰度图。 |
二值化处理 | cv2.threshold() |
将灰度图转换为二值图像。 |
查找轮廓 | cv2.findContours() |
查找图像中的轮廓。 |
绘制轮廓 | cv2.drawContours() |
绘制检测到的轮廓。 |
计算轮廓面积 | cv2.contourArea() |
计算轮廓的面积。 |
计算轮廓周长 | cv2.arcLength() |
计算轮廓的周长。 |
计算边界矩形 | cv2.boundingRect() |
计算轮廓的边界矩形。 |
计算最小外接矩形 | cv2.minAreaRect() |
计算轮廓的最小外接矩形。 |
计算最小外接圆 | cv2.minEnclosingCircle() |
计算轮廓的最小外接圆。 |
多边形逼近 | cv2.approxPolyDP() |
对轮廓进行多边形逼近。 |