将 (x,y) 坐标列表设置为数组,以便绘制多边形
Setting a list of (x,y) cooordinates into an array so polygons are drawn
我有一些代码可以打印出坐标列表(存储在点中
f=open('139cm_2000_frame27.json')
data=json.load(f)
shapes=data["shapes"]
for i in shapes:
print(i['label']) # prints the label first
for c in i['points']:
d=np.array(c)
print(d) # an array containing coordinates in the form (x,y)
d,坐标,是n个10边形的点。所以坐标0-9是第一个多边形的坐标,坐标10-19是第二个多边形...
json 文件中可以有任意数量的多边形,但每个多边形始终有 10 个坐标。
我需要找到一种方法,将这些坐标用于 'draw'/'recreate' 128x128 数组中的这些多边形。
我试过了
from skimage.draw import polygon
img = np.zeros((128, 128), dtype=np.uint8)
r = np.array([#the x coordinates of d])
c = np.array([#the y coordinates of d])
rr, cc = polygon(r, c)
img[rr, cc] = 1 #unsure about the 1
img
但我不知道如何 1) 获取一组 10 个坐标和 2) 将 xs 读入 r 并将 ys 读入 c
非常感谢!
输入示例json:
{
"version": "4.6.0",
"flags": {},
"shapes": [
{
"label": "blob",
"points": [
[
61.42857142857143,
20.285714285714285
],
[
59.10047478151446,
18.879430437885873
],
[
58.04359793578868,
16.37330203102605
],
[
58.661631924538575,
13.724584936383643
],
[
60.71850877026435,
11.94499905752918
],
[
63.42857142857143,
11.714285714285715
],
[
65.75666807562841,
13.120569562114127
],
[
66.81354492135418,
15.62669796897395
],
[
66.19551093260428,
18.275415063616357
],
[
64.13863408687851,
20.05500094247082
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "blob",
"points": [
[
88.71428571428572,
82.42857142857143
],
[
85.63470409582908,
81.33512050565437
......
从软件工程的角度来看,建议将您的代码分解成简单的独立部分(即模块化)。
首先,您需要一个函数来读取输入 json 并对其进行解析。我在下面的代码中称它为 read_input
。
解析数据的格式取决于应用程序。
我选择 return 一对 list
对 ndarray
。列表中的每个元素代表一个多边形。每个多边形包含 2 ndarray
s:1 个用于 x 坐标,1 个用于 y 坐标。我选择这种表示是因为它方便绘制多边形(见下文)。
其次,您需要一个绘制多边形的函数 (draw_polygons
)。它将包含对多边形列表的迭代,并再次出于模块化原因调用较低级别的函数来绘制 1 个多边形 (draw_one_polygon
)。
查看下面的代码:
import json
import numpy as np
from skimage.draw import polygon
def read_input(filename: str):
polygons = []
f = open(filename)
data = json.load(f)
shapes = data["shapes"]
for i in shapes:
cur_poly_points = i["points"]
tmp = list(zip(*cur_poly_points))
# NOTE: The following line assumes that the point coordinates are given as (x,y).
# Change the order of the indices if needed.
polygons.append((np.array(tmp[1]), np.array(tmp[0])))
return polygons
def draw_one_polygon(img, one_poly):
r = one_poly[0];
c = one_poly[1];
rr, cc = polygon(r, c)
img[rr,cc] = 1
def draw_polygons(img, polygons):
for poly in polygons:
draw_one_polygon(img, poly)
filename = '139cm_2000_frame27.json'
polygons = read_input(filename)
img = np.zeros((128, 128), dtype=np.uint8)
draw_polygons(img, polygons)
print(img)
注意:在您的实际代码中,您应该验证坐标不超过图像尺寸。
文档和示例:skimage.draw.polygon
如果您不熟悉此表示法:*cur_poly_points
,请参阅此处:How to unzip a list of tuples into individual lists?。
我有一些代码可以打印出坐标列表(存储在点中
f=open('139cm_2000_frame27.json')
data=json.load(f)
shapes=data["shapes"]
for i in shapes:
print(i['label']) # prints the label first
for c in i['points']:
d=np.array(c)
print(d) # an array containing coordinates in the form (x,y)
d,坐标,是n个10边形的点。所以坐标0-9是第一个多边形的坐标,坐标10-19是第二个多边形...
json 文件中可以有任意数量的多边形,但每个多边形始终有 10 个坐标。
我需要找到一种方法,将这些坐标用于 'draw'/'recreate' 128x128 数组中的这些多边形。
我试过了
from skimage.draw import polygon
img = np.zeros((128, 128), dtype=np.uint8)
r = np.array([#the x coordinates of d])
c = np.array([#the y coordinates of d])
rr, cc = polygon(r, c)
img[rr, cc] = 1 #unsure about the 1
img
但我不知道如何 1) 获取一组 10 个坐标和 2) 将 xs 读入 r 并将 ys 读入 c
非常感谢!
输入示例json:
{
"version": "4.6.0",
"flags": {},
"shapes": [
{
"label": "blob",
"points": [
[
61.42857142857143,
20.285714285714285
],
[
59.10047478151446,
18.879430437885873
],
[
58.04359793578868,
16.37330203102605
],
[
58.661631924538575,
13.724584936383643
],
[
60.71850877026435,
11.94499905752918
],
[
63.42857142857143,
11.714285714285715
],
[
65.75666807562841,
13.120569562114127
],
[
66.81354492135418,
15.62669796897395
],
[
66.19551093260428,
18.275415063616357
],
[
64.13863408687851,
20.05500094247082
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "blob",
"points": [
[
88.71428571428572,
82.42857142857143
],
[
85.63470409582908,
81.33512050565437
......
从软件工程的角度来看,建议将您的代码分解成简单的独立部分(即模块化)。
首先,您需要一个函数来读取输入 json 并对其进行解析。我在下面的代码中称它为 read_input
。
解析数据的格式取决于应用程序。
我选择 return 一对 list
对 ndarray
。列表中的每个元素代表一个多边形。每个多边形包含 2 ndarray
s:1 个用于 x 坐标,1 个用于 y 坐标。我选择这种表示是因为它方便绘制多边形(见下文)。
其次,您需要一个绘制多边形的函数 (draw_polygons
)。它将包含对多边形列表的迭代,并再次出于模块化原因调用较低级别的函数来绘制 1 个多边形 (draw_one_polygon
)。
查看下面的代码:
import json
import numpy as np
from skimage.draw import polygon
def read_input(filename: str):
polygons = []
f = open(filename)
data = json.load(f)
shapes = data["shapes"]
for i in shapes:
cur_poly_points = i["points"]
tmp = list(zip(*cur_poly_points))
# NOTE: The following line assumes that the point coordinates are given as (x,y).
# Change the order of the indices if needed.
polygons.append((np.array(tmp[1]), np.array(tmp[0])))
return polygons
def draw_one_polygon(img, one_poly):
r = one_poly[0];
c = one_poly[1];
rr, cc = polygon(r, c)
img[rr,cc] = 1
def draw_polygons(img, polygons):
for poly in polygons:
draw_one_polygon(img, poly)
filename = '139cm_2000_frame27.json'
polygons = read_input(filename)
img = np.zeros((128, 128), dtype=np.uint8)
draw_polygons(img, polygons)
print(img)
注意:在您的实际代码中,您应该验证坐标不超过图像尺寸。
文档和示例:skimage.draw.polygon
如果您不熟悉此表示法:*cur_poly_points
,请参阅此处:How to unzip a list of tuples into individual lists?。