gpt4 book ai didi

python - 如何关闭轮廓而不是边缘 - OpenCV

转载 作者:太空宇宙 更新时间:2023-11-03 21:11:50 24 4
gpt4 key购买 nike

Tl;DR:如何测量等高线包围的区域而不仅仅是等高线本身

我想在下图中找到对象的轮廓,并有一个适用于大多数情况的代码。 Original Image

随着光照的变化,阈值化和适应性阈值化无法可靠地工作。我使用 Canny 边缘检测并检查该区域以确保找到正确的轮廓。然而,偶尔,当存在无法通过形态学闭合闭合的间隙时,形状是正确的,但该区域是轮廓线而不是整个对象。

Canny Contour Output

我通常做的是使用 convexHull ,因为它返回对象周围的轮廓。但是,在这种情况下,对象沿着顶部向内弯曲,并且 convexHull 不再是该区域的良好近似值。

Contour after Convex Hull

我尝试使用 approxPolyDP但是返回的区域是轮廓线而不是对象。

如何让 approxPolyDP 返回围绕对象的类似闭合轮廓,就像 convexHull 函数一样?

使用上图说明这一点的代码:

import cv2
img = cv2.imread('Img_0.jpg',0)
cv2.imshow('Original', img)

edges = cv2.Canny(img,50,150)
cv2.imshow('Canny', edges)

contours, hierarchy = cv2.findContours(edges,cv2.cv.CV_RETR_EXTERNAL,cv2.cv.CV_CHAIN_APPROX_NONE)

cnt = contours[1] #I have a function to do this but for simplicity here by hand

M = cv2.moments(cnt)
print('Area = %f \t' %M['m00'], end="")

cntHull = cv2.convexHull(cnt, returnPoints=True)
cntPoly=cv2.approxPolyDP(cnt, epsilon=1, closed=True)
MHull = cv2.moments(cntHull)
MPoly = cv2.moments(cntPoly)
print('Area after Convec Hull = %f \t Area after apporxPoly = %f \n' %(MHull['m00'], MPoly['m00']), end="")

x, y =img.shape
size = (w, h, channels) = (x, y, 1)
canvas = np.zeros(size, np.uint8)
cv2.drawContours(canvas, cnt, -1, 255)
cv2.imshow('Contour', canvas)

canvas = np.zeros(size, np.uint8)
cv2.drawContours(canvas, cntHull, -1, 255)
cv2.imshow('Hull', canvas)

canvas = np.zeros(size, np.uint8)
cv2.drawContours(canvas, cntPoly, -1, 255)
cv2.imshow('Poly', canvas)

代码的输出是

Area = 24.500000    Area after Convec Hull = 3960.500000     Area after apporxPoly = 29.500000 

最佳答案

这是一个非常有前途的 ppt来自 geosensor.net,讨论了几种算法。我的建议是使用半径有限的摆臂法。

另一个完全未经测试的想法是按行和列扫描图像(更多方向会提高准确性)和线交叉点之间区域的颜色:

          _______
/-------\
/---------\
--------+---------+------ (fill between 2 intersections)
| |
|
--------+---------------- (no fill between single intersection)
\
-------

随着扫描的线方向数量的增加(超过 90 度和 45 度),最大误差会减小。获得最终区域就像像素计数一样简单。

关于python - 如何关闭轮廓而不是边缘 - OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31292867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com