Python:OpenCV 教程

发布于:2025-09-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

一个开源的计算机视觉和机器学习库。支持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() 对轮廓进行多边形逼近。

网站公告

今日签到

点亮在社区的每一天
去签到