本文末尾整理了人工智能学习资料包,需要自取
推荐优秀的历史文章:
NLP全面梳理三大特征提取器:RNN vs CNN vs Transformer
轮廓近似是什么?
Contour approximation 使用--该算法旨在通过减少给定阈值的顶点来简化折线。一般来说,我们使用曲线来减少顶点的数量,同时保持其大部分形状。我将在这里给出算法的粗略概念。算法将首先找到连接两个参考点的最大距离的顶点。让我们称之为max_point。如果max_point距离小于阈值,我们会自动忽略起点和终点之间的所有顶点,使曲线成为一条直线。如果max_point超过阈值,我们将递归重复算法,现在将其重复max_point重复检查过程作为参考之一。
假如,我们要 开发自动导航机器人,在机器人导航过程中,将不可避免地收集大量的路径数据,然后引导机器人前进,但大多数时候,路径拐点,增加计算负担,如何尽可能保留原始路径数据,可以减少大量计算,这需要一些路径估计,这将使用路径轮廓近似原理。
原始路径
轮廓与图片相似
cv2.approxPolyDP实现轮廓近似原理
# -*- coding: utf-8 -*- import numpy as np import cv2 image = cv2.imread("C:/Users/angel/Desktop/image.png") cv2.imshow("Image", image) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)[1] cv2.imshow("Thresh", thresh) cv2.waitKey(0)
首先,我们导入所需的第三方包。这里最重要的是CV2,然后使用imread函数加载本地图像,因为我们将使用图像中形状的边界,所以我们将图像从 RGB 转换为灰度()。一旦采用灰度格式,就可以使用 OpenCV 的threshold函数()这个形状很容易抠图。
原始图片和隔离的图形
# 在阈值图像中找到最大轮廓 cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) #不同opencv版本的不同 if len(cnts) == 2: cnts = cnts[0] elif len(cnts) == 3: cnts = cnts[1] c = max(cnts, key=cv2.contourArea) #在输出图像上绘制轮廓形状,计算 边界框显示轮廓中的点 output = image.copy() cv2.drawContours(output, [c], -1, (0, 255, 0), 3) (x, y, w, h) = cv2.boundingRect(c) text = "original, num_pts={}".format(len(c)) cv2.putText(output, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) print("[INFO] {}".format(text)) cv2.imshow("Original Contour", output) cv2.waitKey(0)
使用 OpenCV 的findContours函数,我们可以在给定的图像中选择所有可能的轮廓,我们使用它RETR_EXTERNAL它只返回可用轮廓的单一表示,使用的另一个参数是CHAIN_APPROX_SIMPLE。这将删除单个链线连接中的许多顶点,这些顶点本质上是冗余的。然后我们从轮廓数组中捕获最大轮廓并使用它drawContours画出外框形状的函数。
外框轮廓
for eps in np.linspace(0.001, 0.05, 10): peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, eps * peri, True) output = image.copy() cv2.drawContours(output, [approx], -1, (0, 255, 0), 3) text = "eps={:.4f}, num_pts={}".format(eps, len(approx)) cv2.putText(output, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) print("[INFO] {}".format(text)) cv2.imshow("Approximated Contour", output) cv2.waitKey(0)
我们需要一个 valueeps,它将作为测量顶点的阈值,用该阈值计算轮廓近似的参数
在,使用 计算轮廓周长cv2.arcLength函数。然后我们使用它cv2.approxPolyDP启动轮廓近似过程的函数()。eps×peri乘积值通过不同的遍历充当近似精度eps,近似计算轮廓。
通过操作代码,我们可以看到eps值不断增加,轮廓顶点数不断减少,直到顶点数不再减少,说明轮廓近似算法确实有效。
[INFO] original, num_pts=402 [INFO] eps=0.0010, num_pts=30 [INFO] eps=0.0064, num_pts=25 [INFO] eps=0.0119, num_pts=18 [INFO] eps=0.0173, num_pts=15 [INFO] eps=0.0228, num_pts=14 [INFO] eps=0.0282, num_pts=10 [INFO] eps=0.0337, num_pts=7 [INFO] eps=0.0391, num_pts=6 [INFO] eps=0.0446, num_pts=5 [INFO] eps=0.0500, num_pts=5
轮廓近似原理图
当然,在应用中,我们需要找到合适的eps在保证轮廓精度的同时,降低计算成本。
我整理了一个关于pytorch、python基础,图像处理opencv\自然语言处理、机器学习、数学基础等资源数据库,想要学习人工智能或转向高薪行业,大学生非常实用,免费提供,内部资源,人工智能问题数据库,大厂面试题 学习大纲 自学课程大纲2000G人工智能资料礼包免费哦~扫码加V免费获取资料.