一篇文章带你直观理解OpenCV:从操作到实战

在图像处理领域,OpenCV(Open Source Computer Vision Library)是一个广泛使用的计算机视觉库。它提供了丰富的函数接口,帮助我们处理图像和视频数据。本文将通过实例深入探讨OpenCV中常见的操作,帮助大家理解每个操作的核心原理,并通过代码示例加以实现。

目录

一、opencv常见操作

1.格式转换操作

1.1 灰度图转换

1.2 HSV转换

2. 二值化操作

3. 滤波操作

3.1 均值滤波

3.2 方框滤波

3.3 高斯滤波

3.4 中值滤波

4.形态学操作

4.1 腐蚀操作

4.2 膨胀操作

4.3 开运算(先腐蚀再膨胀)

4.4 闭运算(先膨胀再腐蚀)

4.5 梯度运算

4.6 礼帽(Top Hat)

4.7 黑帽(Black Hat)

5.边缘检测

5.1 Sobel算子

5.2 Scharr算子

5.3 Laplacian算子

5.4 Canny边缘检测

6.图像金字塔

6.1 高斯金字塔

6.2 拉普拉斯金字塔

7.图像轮廓

7.1 查找轮廓

7.2 绘制轮廓

7.3 轮廓特征

7.4 轮廓近似

7.5 外接矩形

7.6 外接圆

二、OpenCV 项目实战:文档扫描

1. 项目整体流程

2. 完整代码

3. 步骤解析

3.1 读取输入图像并设置参数

3.2 预处理:灰度化、模糊和边缘检测

3.3 轮廓检测

3.4 透视变换

3.5 二值化处理

3.6 保存结果


一、opencv常见操作

1.格式转换操作

1.1 灰度图转换

  • 通俗理解:将彩色图像转换为灰度图,常用于简化图像处理的复杂性,通常用于图像的预处理阶段。
  • 核心原理:从 BGR 颜色空间转换为灰度图,灰度图只保留亮度信息,去除色彩信息。
  • 代码示例
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
  • 参数说明
    • img: 输入图像,通常为彩色图像。
    • cv2.COLOR_BGR2GRAY: 指定颜色空间转换类型,将 BGR 图像转换为灰度图。

1.2 HSV转换

  • 通俗理解:将彩色图像转换为 HSV 颜色空间,HSV 更符合人眼感知的颜色模式,常用于颜色分割和特定颜色区域的检测。
  • 核心原理:通过色调、饱和度和亮度的三个分量来表示颜色,便于对颜色进行处理和分析。
  • 代码示例
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    
  • 参数说明
    • img: 输入图像,通常为彩色图像。
    • cv2.COLOR_BGR2HSV: 指定颜色空间转换类型,将 BGR 图像转换为 HSV 图像。

2. 二值化操作

  • 通俗理解:将图像转换为黑白图像,通过设定一个阈值来决定哪些区域是白色,哪些是黑色,常用于图像的分割。
  • 核心原理:通过设定一个阈值,低于阈值的像素值变为黑色(0),高于阈值的像素值变为白色(255)。
  • 代码示例
    ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
    
  • 参数说明
    • img_gray: 输入的灰度图像。
    • 127: 阈值,低于该值的像素设为 0(黑),高于该值的像素设为 255(白)。
    • 255: 最大值,即像素值超过阈值时赋值为 255。
    • cv2.THRESH_BINARY_INV: 反向二值化,像素大于阈值设为 0,小于阈值设为 255。

3. 滤波操作

3.1 均值滤波

  • 通俗理解:用一个小窗口对图像进行模糊处理,降低图像中的噪声,产生柔和效果。
  • 核心原理:使用一个滑动窗口(如 3x3),对每个像素及其邻域像素进行平均,来平滑图像。
  • 代码示例
    blur = cv2.blur(img, (3, 3))
    
  • 参数说明
    • img: 输入图像。
    • (3, 3): 卷积核的大小,决定了模糊效果的程度。较大的卷积核会产生更强的模糊效果。

3.2 方框滤波

  • 通俗理解:类似于均值滤波,但可以通过设置 normalize 来控制是否归一化,常用于图像去噪。
  • 核心原理:通过滑动一个方形窗口,对每个窗口内的像素值求和并赋值给中心像素。可以控制是否归一化窗口内的像素总和。
  • 代码示例
    box = cv2.boxFilter(img, -1, (3, 3), normalize=True)
    
  • 参数说明
    • img: 输入图像。
    • -1: 输出图像深度与输入图像相同。
    • (3, 3): 卷积核大小,决定了处理区域的大小。
    • normalize=True: 是否归一化,True 会使得窗口内像素的总和为 1,False 则不归一化。

3.3 高斯滤波

  • 通俗理解:通过高斯函数进行模糊,能够更加平滑地去除噪声,常用于去噪和平滑图像。
  • 核心原理:使用一个高斯核(加权的卷积核)进行图像模糊,较中心的像素会有较大的权重,离中心较远的像素权重较小。
  • 代码示例
    gaussian = cv2.GaussianBlur(img, (5, 5), 1)
    
  • 参数说明
    • img: 输入图像。
    • (5, 5): 高斯核的大小,通常为奇数。较大的核会产生更强的模糊效果。
    • 1: 高斯函数的标准差,较大的标准差会产生更强的模糊效果。

3.4 中值滤波

  • 通俗理解:主要用于去除椒盐噪声,通过替换每个像素为邻域像素的中值来去噪。
  • 核心原理:对图像中的每个像素,取其邻域像素的中位数值来替换该像素值,有效去除椒盐噪声。
  • 代码示例
    median = cv2.medianBlur(img, 5)
    
  • 参数说明
    • img: 输入图像。
    • 5: 卷积核的大小,通常是奇数,决定了去噪的范围。

4.形态学操作

形态学操作(闭运算、梯度运算、礼帽和黑帽)都是基于形态学变换的,它们可以帮助在图像处理过程中提取和增强图像的细节,通常用于噪声去除、物体边界提取、图像分割等任务。

4.1 腐蚀操作

  • 通俗理解:腐蚀操作使得图像中的亮区域变小,暗区域变大,常用于去除小的噪点。
  • 核心原理:通过一个卷积核,将图像的每个像素与卷积核进行运算,只有当卷积核的全部区域都为“亮”时,中心像素才保持不变,其他情况下会变为“暗”。
  • 代码示例
    erosion = cv2.erode(img, kernel, iterations=1)
    
  • 参数说明
    • img: 输入图像。
    • kernel: 卷积核,控制腐蚀的形态。
    • iterations=1: 腐蚀的迭代次数,次数越多,腐蚀效果越明显。

4.2 膨胀操作

  • 通俗理解:膨胀操作会扩展图像中的亮区域,常用于填补腐蚀操作后留下的空洞。
  • 核心原理:通过卷积核,将图像的亮区域扩展,暗区域变小,能填补图像中的小孔洞。
  • 代码示例
    dilate = cv2.dilate(img, kernel, iterations=1)
    
  • 参数说明
    • img: 输入图像。
    • kernel: 卷积核,控制膨胀的形态。
    • iterations=1: 膨胀的迭代次数,次数越多,膨胀效果越明显。

4.3 开运算(先腐蚀再膨胀)

  • 通俗理解:开运算是先腐蚀后膨胀,通常用于去除图像中的小亮点或噪声。
  • 核心原理:开运算先腐蚀图像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值