OpenCV图像轮廓

本文概述

等高线定义为连接所有具有相同颜色或强度的连续点(沿边界)的曲线。在另一方面, 我们在二进制图像中找到计数器, 我们集中精力在二进制图像中找到边界。官方定义如下:

“轮廓”是用于形状分析以及对象检测和识别的有用工具。

为了保持准确性, 我们应该使用二进制图像。首先, 我们应用阈值或精巧边缘检测。

在OpenCV中, 在二进制图像中查找轮廓与从黑色背景中查找白色对象相同。

OpenCV提供了findContours(), 用于在二进制图像中查找轮廓。语法如下:

cv2. findContours (thes, cv2.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

findContours()接受三个参数, 第一个参数是源图像, 第二个参数是轮廓检索模式, 第三个参数是轮廓逼近。

让我们考虑以下示例:

import numpy as np
import cv2 as cv
im = cv.imread(r'C:\Users\DEVANSH SHARMA\binary.png')
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

如何绘制轮廓?

OpenCV提供了cv2.drawContours()函数, 该函数用于绘制轮廓。它也可通过提供其边界点来绘制任何形状。 cv2.drawContours()函数的语法如下:

要在图像中绘制所有轮廓:

cv2.drawCounter(img, contours, -1, (0, 255, 0), 3)

要绘制单个轮廓, 假设第三个计数器

cnt = contours[3]
cv2.drawCounter(img, [cnt], 0, (0, 255, 0), 3)

第一个参数表示图像源, 第二个参数表示应作为Python列表传递的轮廓, 第三个参数用作轮廓的索引, 其他参数用于颜色厚度。

轮廓近似法

它是cv2.findCounter()中的第三个参数。上面, 我们已经描述了它以相同的强度绘制形状的边界。它存储形状边界的(x, y)坐标。但是这里出现的问题是它是否存储所有坐标?这由轮廓逼近方法指定。

如果我们通过cv.CHAIN_APPROX_NONE, 它将存储所有边界点。有时它不需要存储所有的点坐标, 假设我们发现了一条直线的轮廓, 不需要存储所有的轮廓点, 而只需要存储两个端点即可。因此, 在这种情况下, 我们使用cv.CHAIN_APPROX_NONE, 它将删除所有冗余点并压缩轮廓, 从而节省内存。

示例1

OpenCV图像轮廓

在上面的矩形图像中, 第一个图像显示使用cv.CHAIN_APPROX_NONE(734)的点, 第二个图像显示使用cv2.CHAIN_APPROX_SIMPLE的点(仅4个点)。我们可以看到两个图像之间的差异。


微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?