apporxPolyDP和convexHull的区别?轮廓多边形逼近和凸包有什么不同?apporxPolyDP和convexHull的效果对比
一、背景
学习CV的过程中看到了这两个函数,简单记录一下
1. apporxPolyDP
轮廓多边形逼近 apporxCurve=cv2.apporxPolyDP(curve,epsilon,closed)
2.convexHull
凸包 hull=cv2.convexHull(points[,clockwise,[,returnPoints]])
二、代码及效果
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('hand.jpg', cv.IMREAD_COLOR)
img2 = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
_ret, img2 = cv.threshold(img2, 20, 255, cv.THRESH_BINARY)
img2, contours, hierarchy = cv.findContours(img2, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
# apporxCurve
# apporxCurve=cv2.apporxPolyDP(curve,epsilon,closed)
COEFF = 0.01
epl = cv.arcLength(contours[0], True) * COEFF
apporx = cv.approxPolyDP(contours[0], epl, True)
app_img = img.copy()
app_img = cv.drawContours(app_img, [apporx], -1, color=(0, 0, 255), thickness=10)
# hull=cv2.convexHull(points[,clockwise,[,returnPoints]])
hull = cv.convexHull(contours[0])
hull_img = img.copy()
hull_img = cv.drawContours(hull_img, [hull], -1, color=(0, 0, 255), thickness=10)
plt.subplot(221), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB)), plt.title('Org'), plt.axis('off')
plt.subplot(222), plt.imshow(img2, cmap='gray'), plt.title('binary'), plt.axis('off')
plt.subplot(223), plt.imshow(cv.cvtColor(app_img, cv.COLOR_BGR2RGB)), plt.title('apporx'), plt.axis('off')
plt.subplot(224), plt.imshow(cv.cvtColor(hull_img, cv.COLOR_BGR2RGB)), plt.title('hull'), plt.axis('off')

简单来说,
-
apporxPolyDP就是以多边形去逼近轮廓,采用的是Douglas-Peucker算法(方法名中的DP);
-
逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一一个多边形的凸包来简化它。凸包跟逼近多边形很像,只不过它是物体最外层的「凸多边形。凸包指的是完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形。凸包的每- -处都是凸的,即在凸包内连接任意两点的直线都在凸包的内
部。在凸包内,任意连续三个点的内角小于180°。
跑出来看图会有一个直观的理解
3112




被折叠的 条评论
为什么被折叠?



