PIL:如何在给定一组无序轮廓尺寸的情况下绘制形状

PIL: How to draw shapes given a set of unordered outline dimensions

我正在使用 Python 版本 3.8.7 和 PIL 库。

我有一个包含蓝图各种元素维度的 DataFrame。两个主要元素是线条(构成轮廓)和标签(彩色矩形)。我使用 PIL 绘制了下图。

但是,我想将每个房间的颜色填写为与其内的相应标签相同的颜色。现在我只有形成轮廓的线的尺寸(坐标)和标签的尺寸。各维度值(坐标)如下:

(x_min, y_min, x_max, y_max)

每个标签的适当颜色是预定义的。

这些列表都是无序的,我想知道如何为每个标记的房间用正确的颜色填充轮廓内的区域。一些有趣的注意事项是,有些线虽然看起来是一条连贯的直线,但实际上是由多条线组成的。

如果需要,绘制矩形的代码为:

                #Dimensions/coordinates    # Color                # Outline Color
draw.rectangle((200, 100, 300, 200), fill=(0, 192, 192), outline=(255, 255, 255))

我不确定如何完成这个任务。

如果这是预期的结果:

你可以使用这个伪代码:

for thisColour in list of blob colours (1)
   generate list of neighbours 1-pixel outside this blob (2)
   for thisNeighbour in list of neighbours
      if thisNeighbour is currently white
         floodfill with thisColour from thisNeighbour as seed (3)
  1. 您应该有一个彩色斑点列表。
  2. 这是简单的数学运算,因为您的彩色斑点都是矩形,您只需将斑点左上角的 x,y 值减去 1,然后将底部的 x,y 值加 1-右上角。因此,如果您的 blob 位于 8,10 到 100,110 之间,那么邻居就是矩形 7,9 到 99,109 边上的点。 scikit-image 有一个 rectangle_perimter() 也可以为您执行此操作。如果你的斑点是任何复杂的形状,你可以使用形态学开口来获得它们。
  3. 为此使用 floodfill()

顺便说一句,在使用 JPEG 格式进行图像处理之前请三思,因为它有损并且会扭曲颜色,您最终不得不添加 “软糖因素” 和各处的公差允许它引入的“错误”。通常最好使用无损的 PNG 格式,尤其是对于像您这样的计算机生成的块状图形。