如何在 python 中用虚线标记的给定区域制作分割掩码
how to make segmentation mask given region marked with dotted line in python
我想通过编码为一些图像制作分割掩码。有一个工具可以生成 xml 文件,其中包含大约边界点的坐标。这些坐标可以通过获取标签值获得。图像大小为 800x600 像素。
例如,从该工具中提取了以下要点。如何填充用虚线标记的轮廓内的区域,例如白色?谢谢
分 = [(737, 255), (736, 265), (735, 270), (739, 273), (746, 264),
(755, 268), (765, 272), (767, 276), (769, 278), (776, 275), (776, 264),
(767, 260), (753, 257), (738, 256), (738, 256), (479, 247), (455, 244),
(446, 245), (440, 243), (430, 244), (423, 241), (419, 238), (412, 232),
(406, 225), (403, 202), (404, 185), (410, 170), (414, 166), (424, 160),
(439, 157), (456, 166), (469, 177), (472, 197), (480, 199), (492, 214),
(494, 207), (488, 201), (492, 193), (497, 194), (502, 196), (510, 196),
(518, 197), (523, 202), (521, 209)]
import Image
import numpy as np
a = Image.new('RGB',(800,600),0)
for p in points:
a.putpixel(p,(255,255,255))
a.show()
a.save('./Original_mask.png')
Original_mask:
Expected_mask:
基本上来说,如果你想填充由散点限制的区域,你可以使用cv2.drawContours
。
import cv2
import numpy as np
points = [
(737, 255), (736, 265), (735, 270), (739, 273), (746, 264),
(755, 268), (765, 272), (767, 276), (769, 278), (776, 275), (776, 264),
(767, 260), (753, 257), (738, 256), (738, 256), (479, 247), (455, 244),
(446, 245), (440, 243), (430, 244), (423, 241), (419, 238), (412, 232),
(406, 225), (403, 202), (404, 185), (410, 170), (414, 166), (424, 160),
(439, 157), (456, 166), (469, 177), (472, 197), (480, 199), (492, 214),
(494, 207), (488, 201), (492, 193), (497, 194), (502, 196), (510, 196),
(518, 197), (523, 202), (521, 209)
]
canvas = np.zeros((600, 800,3), np.uint8)
pts = np.array([[x,y] for(x,y) in points])
cv2.drawContours(canvas, [pts],-1, (0,255,0), -1)
cv2.polylines(canvas, [pts], isClosed=True, color=(255,0,0), thickness=2)
cv2.imshow("canvas", canvas);cv2.waitKey();cv2.destroyAllWindows()
我认为点的顺序可能不对。
xml文件中有一个名为'object'的标签,所以直接读取点的属性我应该首先找到所有对象,然后绘制每个对象定义的轮廓。
我想通过编码为一些图像制作分割掩码。有一个工具可以生成 xml 文件,其中包含大约边界点的坐标。这些坐标可以通过获取标签值获得。图像大小为 800x600 像素。
例如,从该工具中提取了以下要点。如何填充用虚线标记的轮廓内的区域,例如白色?谢谢
分 = [(737, 255), (736, 265), (735, 270), (739, 273), (746, 264), (755, 268), (765, 272), (767, 276), (769, 278), (776, 275), (776, 264), (767, 260), (753, 257), (738, 256), (738, 256), (479, 247), (455, 244), (446, 245), (440, 243), (430, 244), (423, 241), (419, 238), (412, 232), (406, 225), (403, 202), (404, 185), (410, 170), (414, 166), (424, 160), (439, 157), (456, 166), (469, 177), (472, 197), (480, 199), (492, 214), (494, 207), (488, 201), (492, 193), (497, 194), (502, 196), (510, 196), (518, 197), (523, 202), (521, 209)]
import Image
import numpy as np
a = Image.new('RGB',(800,600),0)
for p in points:
a.putpixel(p,(255,255,255))
a.show()
a.save('./Original_mask.png')
Original_mask:
Expected_mask:
基本上来说,如果你想填充由散点限制的区域,你可以使用cv2.drawContours
。
import cv2
import numpy as np
points = [
(737, 255), (736, 265), (735, 270), (739, 273), (746, 264),
(755, 268), (765, 272), (767, 276), (769, 278), (776, 275), (776, 264),
(767, 260), (753, 257), (738, 256), (738, 256), (479, 247), (455, 244),
(446, 245), (440, 243), (430, 244), (423, 241), (419, 238), (412, 232),
(406, 225), (403, 202), (404, 185), (410, 170), (414, 166), (424, 160),
(439, 157), (456, 166), (469, 177), (472, 197), (480, 199), (492, 214),
(494, 207), (488, 201), (492, 193), (497, 194), (502, 196), (510, 196),
(518, 197), (523, 202), (521, 209)
]
canvas = np.zeros((600, 800,3), np.uint8)
pts = np.array([[x,y] for(x,y) in points])
cv2.drawContours(canvas, [pts],-1, (0,255,0), -1)
cv2.polylines(canvas, [pts], isClosed=True, color=(255,0,0), thickness=2)
cv2.imshow("canvas", canvas);cv2.waitKey();cv2.destroyAllWindows()
我认为点的顺序可能不对。
xml文件中有一个名为'object'的标签,所以直接读取点的属性我应该首先找到所有对象,然后绘制每个对象定义的轮廓。