<p>我想建议一种更简单、更有效的方法,更重要的是,它不会产生错误的端点:</p>
<p>想法很简单,在细化后,计算相邻像素(8连接性)<code>if neighbours count equals 1 > the point is an end point</code></p>
<p>代码是不言自明的:</p>
<pre><code>def get_end_pnts(pnts, img):
extremes = []
for p in pnts:
x = p[0]
y = p[1]
n = 0
n += img[y - 1,x]
n += img[y - 1,x - 1]
n += img[y - 1,x + 1]
n += img[y,x - 1]
n += img[y,x + 1]
n += img[y + 1,x]
n += img[y + 1,x - 1]
n += img[y + 1,x + 1]
n /= 255
if n == 1:
extremes.append(p)
return extremes
</code></pre>
<p>主要内容:</p>
<pre><code>img = cv2.imread(p, cv2.IMREAD_GRAYSCALE)
img = cv2.threshold(img, 128, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
img = cv2.ximgproc.thinning(img)
pnts = cv2.findNonZero(img)
pnts = np.squeeze(pnts)
ext = get_end_pnts(pnts, img)
for p in ext:
cv2.circle(img, (p[0], p[1]), 5, 128)
</code></pre>
<p>输出:
<a href="https://i.stack.imgur.com/1dXqv.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/1dXqv.png" alt="enter image description here"/></a></p>
<p>编辑:您可能有兴趣访问我对<a href="https://stackoverflow.com/a/60913155/4734439">this similar question</a>的答案。它有一些额外的功能,它检测端点和连接器点以及</p>