边缘和轮廓检测——计算机视觉的应用

计算机视觉的重点是从计算机中的视频和图像中提取有意义的信息。在本文中,我们将从初学者开始探索一个使用 OpenCV 的出色计算机视觉项目。
其标题是“使用计算机视觉进行边缘和轮廓检测”。对于此项目,你还将看到描述、源代码和图像分类。

边缘检测

边缘检测是一种用于定位图像中对象边界的图像处理技术。最流行和广泛使用的算法之一是 Canny 边缘检测器。
Canny 边缘检测器是一种立足点检测算子,它使用多阶段算法来检测图像中的各种边缘。
主要阶段是:
  1. 使用高斯模糊算法,过滤掉图像。
  2. 在 Sobel 滤波器的帮助下,找出边缘的强度和方向。
  3. 通过应用非极大值抑制来隔离更强的边缘并将它们细化为一条像素宽的线。
  4. 使用滞后来隔离最简单的边缘。
下面我们安装 OpenCV :
pip3 install opencv-python matplotlib numpy
打开一个 Python 文件并按照以下步骤操作:
import cv2
import numpy as np
import matplotlib.pyplot as plt
现在为了检测它的边缘,我们必须读取图像:
# read the image
image = cv2.imread('little_flower.jpg')
首先,我们必须将图像转换为灰度,然后,我们可以继续将图像绕过 Canny 边缘检测器。
我们来看一下:
# convert it to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
让我们来看看它:
# show the grayscale image
plt.imshow(gray, cmap='gray')
plt.show()
在 Canny 算法的帮助下,我们必须标记作为输入的图像中的边缘。
输入图像首先传递给 cv2.Canny() 函数,然后用于边缘检测。
# perform the canny edge detector to detect image edges
edges = cv2.Canny(gray, threshold1=30, threshold2=100)
阈值 1 和阈值 2 之间的最小值用于边缘链接。最重要的值用于寻找强边缘的初始段。
让我们看看结果图像:
有趣的是,尝试微调边缘值,看看你是否会让它变得更好。
如果你想使用实时摄像头,这里是完整的代码:
import NumPy as np
import cv2
cap = cv2.VideoCapture(0)
while True:
    _, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 30, 100)
    cv2.imshow('edges', edges)
    cv2.imshow('gray', gray)
    if cv2.waitKey(1) == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()
检测边缘的最终目的是捕捉重要事件并在行星属性内执行所需的更改。它是图像处理、图像模式识别和计算机视觉技术的基本步骤之一。

轮廓检测

一个轮廓可以描述为一条曲线,将所有具有相同颜色或强度的连续点组合在一起。基本上,它们显示图片中包含的对象的形状。轮廓检测可能是一种用于形状分析和对象检测和识别的有用技术。
轮廓检测并不是图像分割的唯一算法,还有很多其他算法,例如目前最先进的语义分割、霍夫变换和 K-Means 分割。
为了获得更好的准确性,我们将遵循以下整个流程来成功检测图像中的轮廓:
  • 输入图像的标准化是它应该始终是二进制形式。这就是为什么我们需要将其转换为二进制格式。
  • 用于查找轮廓的 OpenCV 函数是 findContours()。
  • 最后,我们必须绘制这些轮廓来显示图像。
好吧,让我们开始吧。
首先,让我们为这个项目安装所有必需的依赖项:
pip3 install matplotlib opencv-python
在这里,我们导入所需的模块:
import cv2
import matplotlib.pyplot as plt
让我们加载本教程中使用的图像:
# read the image
image = cv2.imread('thumbs_up_down.jpg')
将其转换为 RGB,然后转换为灰度:
# convert to RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
正如本教程前面提到的,我们要创建一个二值图像,这表明图像的每个像素要么是黑色的,要么是白色的。
你可以将其进行比较,就像查找轮廓与检测黑板上的白色物体更相似。我们要找的物体是白色的,所以黑板需要是纯黑色的。
# create a binary thresholded image
_, binary = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)
# show it
plt.imshow(binary, cmap='gray')
plt.show()
通过禁用像素(即将其设置为0)和启用像素(即将其设置为225),创建二进制图像。以下是输出图像:
现在,对于 OpenCV 来说,这通常很容易检测轮廓:
# find the contours from the thresholded image
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# draw all contours
image = cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
上述代码很容易找到二值图像中的轮廓,最后借助粗绿线将它们输出到图像中,让我们展示一下:
# show the image with the drawn contours
plt.imshow(image)
plt.show()
输出图像:
为了在不同的世界图像上获得良好的结果,你需要调整阈值或执行边缘检测。例如,对于煎饼图像,我将边缘减少到 127,结果如下:

轮廓检测和边缘检测的区别

轮廓检测的目标是确定闭合物体的形状,特别是因为对于具有相同颜色强度的连续点,寻找轮廓的方法是确定的,而边缘检测是通过检测颜色强度内的变化来进行的。对整个图像进行边缘检测,而仅对图像内的对象进行轮廓检测。

结论

这个项目是初学者级别的,面向数据科学爱好者。本文旨在让你熟悉最简单的计算机视觉项目,以增强你在计算机视觉方面的知识。
☆ END ☆
(0)

相关推荐

  • 【从零学习OpenCV 4】Canny算法

    小白学视觉",选择"星标"公众号 重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为 ...

  • 使用OpenCV进行对象检测

    重磅干货,第一时间送达 目标检测是图像处理的重要组成部分.自动驾驶汽车必须检测车道,路面,其他车辆,人,标志和信号等.我们生活在一个动态的世界中,一切都在不断变化.对象检测的应用无处不在. 我们正在研 ...

  • 使用OpenCV和TesseractOCR进行车牌检测

    重磅干货,第一时间送达 目录 1)目的和简介 2)前言 3)使用OpenCV和Haar级联进行车牌检测 4)使用TesseractOCR识别和提取车牌号 目的与简介 当我们谈论AI时,计算机视觉绝对是 ...

  • 使用OpenCV+Python进行Canny边缘检测

    重磅干货,第一时间送达 如果我们环顾房间,我们会看到大量的物体,每一个都很容易区分,并有自己独特的边缘.我们区分物体的先天能力部分来自于我们的视觉系统检测边缘的能力.检测边缘是视觉的一项基本任务,尽管 ...

  • 常见的图像处理技术

    重磅干货,第一时间送达 本期文章中,让我们一起来学习以下内容. 通过PIL和OpenCV来使用一些常见的图像处理技术,例如将RGB图像转换为灰度图像.旋转图像.对图像进行消噪.检测图像中的边缘以及裁剪 ...

  • 二值化处理与边缘检测

    问题:我在提取图像边缘的时候,首先对图像进行灰度变换,之后进行二值处理,最后进行边缘检测得到边缘图像. 但是在查阅资料的过程中我经常发现很多人忽略二值化的步骤,直接进行边缘检测:还有很多人在实现某些功 ...

  • 让机器“看见”:图像数据的特征提取方法

    Datawhale & LSGO 每日干货 &每月组队学习,不错过 Datawhale干货 作者:谢雨飞,趣头条算法工程师 图像特征主要有图像的颜色特征.纹理特征.形状特征和空间关系特 ...

  • 基于OpenCV的车辆变道检测

    重磅干货,第一时间送达 本期教程我们将和小伙伴们一起研究如何使用计算机视觉和图像处理技术来检测汽车在行驶中时汽车是否在改变车道!大家一定听说过使用OpenCV 的haar级联文件可以检测到面部.眼睛等 ...

  • 【学术论文】基于最小二乘法与霍夫变换的虹膜定位算法

    摘要 为解决定位虹膜内外边缘时因轮廓信息不足会出现的定位不准确或者失败问题,提出一种采用霍夫变换与最小二乘法相结合的定位算法.首先使用形态学开操作减少图像中孤立的小点,并利用自适应阈值算法二值化图像: ...

  • OpenCV探索之路(十一):轮廓查找和多边形包围轮廓

    Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...

  • 《HALCON机器视觉与算法原理编程实践》第10章 边缘检测

    文章目录 10.1 像素级边缘提取 10.1.1 经典的边缘检测算子 10.1.2 边缘检测的一般流程 10.1.3 sobel_amp算子 10.1.4 edges_image算子 10.1.5 其 ...

  • 基于OpenCV的实用图像处理操作

    重磅干货,第一时间送达 图像处理适用于图像和视频.良好的图像处理结果会为后续的进一步处理带来很大的帮助,例如提取到图像中的直线有助于对图像中物体的结构进行分析,良好的特征提取会优化深度学习的结果等.今 ...

  • 【OpenCV读取标记点坐标】管道测速

    文章目录 一.项目简介 二.思考步骤 1. 图像二值化 2. 滤波去噪 3. Canny算法检测边缘 4. 查找轮廓并计算 5. 绘制轮廓并表示质心 三.测试结果 四.工程代码 一.项目简介 昨天一个 ...