问题:检测手掌图片凸包的时候,会出现多个轮廓。
解决方法:在二值化处理的时候使用大津算法
代码演示:
import cv2 as cv
img = cv.imread("hand.jpg")
img = cv.resize(img, None, fx=0.4, fy=0.4)
# 轮廓检测
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY+cv.THRESH_OTSU) # 大津算法
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
for i in range(len(contours)):
hull = cv.convexHull(contours[i])
length = len(hull)
for i in range(len(hull)):
cv.line(img, tuple(hull[i][0]), tuple(hull[(i+1) % length][0]), (0, 255, 0), 2)
cv.imshow("r1", img)
cv.waitKey(0)
原因:大津算法可以自动匹配到最优的阈值
OTSU算法也称最大类间差法,有时也称之为大津算法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。