此问题在此处已有答案:
numpy.unique with order preserved(7个答案)
2天前关闭。
此帖子是在2天前编辑并提交审查的。
我有像下面这样的图像,我想提取轮廓并按顺时针或逆时针顺序排列顶点。我需要使用它们进行一些计算,所以它必须排序,以便通过遍历轮廓找到点。
的数据
我尝试使用cv2.findContours()
,但它返回的轮廓关闭。
Title是脚本的当前执行时间。
你可以清楚地看到它的两倍。
我试着只提取唯一的坐标,但这会导致一些排序问题。(忽略红线)
提取轮廓的代码:
代码
dirPictures = os.listdir(sourcePath)
for path in dirPictures:
if( '.' in path and path.split('.')[-1].lower() in acceptedFileTypes):
#Reset plots to default figure size
plt.rcParams["figure.figsize"] = plt.rcParamsDefault["figure.figsize"]
plt.gca().invert_yaxis()
# Extract contour
img = cv2.imread(sourcePath + '/' + path, cv2.IMREAD_GRAYSCALE)
cont, hier = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
字符串
编辑:
我认为使用np.where()
和排序的想法是可行的,但在少数情况下仍然失败。轮廓顶点不是从轮廓的边缘开始,所以我不相信排序会起作用。
结束位置:
型
编辑2:我尝试使用svg路径,但也失败了。我使用了tatrize的potracer
here
型
代码:
# Extract contour
img = cv2.imread(sourcePath + '/' + path, cv2.IMREAD_GRAYSCALE)
img = np.array(img)
# Create a bitmap from the array
bmp = potrace.Bitmap(img)
# Trace the bitmap to a path
path = bmp.trace()
# Iterate over path curves
x = []
y = []
for curve in path:
print ("start_point =", curve.start_point)
for segment in curve:
print(segment)
end_point_x, end_point_y = segment.end_point.x, segment.end_point.y
if segment.is_corner:
c_x, c_y = segment.c.x, segment.c.y
else:
c1_x, c1_y = segment.c1.x, segment.c1.y
c2_x, c2_y = segment.c2.x, segment.c2.y
x.append(c1_x)
y.append(c1_y)
x.append(c2_x)
y.append(c2_y)
#turn into array of coord pairs [[x,y]...]
k = np.stack((x,y), axis=-1)
#Keep unique, ordered points
_, idx = np.unique(k, axis=0, return_index=True)
k = k[np.sort(idx)]
plt.plot(k[:,0], k[:,1], 'g.-')
plt.show()
型
1条答案
按热度按时间kr98yfug1#
您可能会发现使用
potrace
将形状转换为SVG并解析其输出更容易。因此,如果将形状保存为PGM文件,则可以运行:字符串
你会得到以下结果:
型