<p>与<a href="https://stackoverflow.com/a/56935828/11753040">suggestion</a>一致的是,下面是一个似乎可以解决我的问题的代码片段。在</p>
<pre class="lang-py prettyprint-override"><code>def full_from_sparse(contour):
horizontal = np.array([1, 0], 'int')
vertical = np.array([0, 1], 'int')
diagonal = np.array([1, 1], 'int')
def _get_points(p0, p1):
# find all points on line connecting p0 and p1,
# including p0, excluding p1
# line must be horizontal, vertical or diagonal
diff = p1-p0
if np.max(np.abs(diff)) <= 1:
# p0 and p1 are neighbor points
# or duplicate points, i.e.g no in-between points
return [p0]
if diff[0] == 0:
# vertical
fac = diff[1]
inc = vertical
elif diff[1] == 0:
# horizontal
fac = diff[0]
inc = horizontal
elif diff[0] == diff[1]:
# diagonal
fac = diff[0]
inc = diagonal
else:
raise Exception("points not connected", p0, p1)
return [p0 + _fac*inc for _fac in range(0, fac, np.sign(fac))]
full = []
points = contour[:, 0, :]
for i in range(len(points)-1):
_points = _get_points(points[i], points[i+1])
full.extend(_points)
# add points from last segment, endpoint to startpoint
_points = _get_points(points[-1], points[0])
full.extend(_points)
# reshape as contour
full = np.array(full, dtype='int')
rows, cols = full.shape
return full.reshape(rows, 1, cols)
</code></pre>