【问题标题】:Fill in a hollow shape using Python and pillow (PIL)使用 Python 和枕头 (PIL) 填充空心形状
【发布时间】:2017-09-06 20:32:59
【问题描述】:

我正在尝试编写一种方法来填充给定的形状,使其变为纯黑色。

示例: 这个最初只是一个轮廓的八边形将变成一个纯黑色的八边形,但是只要所有边缘都闭合,这应该适用于任何形状。

Octagon

def img_filled(im_1, im_2):
    img_fill_neg = ImageChops.subtract(im_1, im_2)
    img_fill = ImageOps.invert(img_fill_neg)
    img_fill.show()

我已经阅读了 10 倍以上的文档,并找到了其他几种操作图像的方法,但是我找不到填充图像中预先存在的形状的示例。我看到使用 floodfill() 是一种选择,虽然我不确定如何获取我想要填充的形状。

注意:我无权访问任何其他图像处理库来执行此任务。

【问题讨论】:

  • 您可能没有使用“flood-fill”一词进行搜索,这听起来像是您想做的,即How to flood-fill part of a bitmap enclosed by a black border with my chosen color?
  • 感谢 Nick T 的建议。我也浏览过该页面。我使用该方法遇到的问题是我无法弄清楚要抓住我要填充的形状。 floodfill(img, (x,y), value, border) 需要 4 个参数,我遇到了 (x,y) 的问题,因为我不想要特定的像素,而是想要整个形状。感谢您的任何建议。
  • 我将把问题重述为“我如何在形状内找到一个点”或类似的东西。
  • 你可以通过寻找轮廓找到形状。在您的图像中,您将有一个轮廓。完成后,您可以找到轮廓的质心,并使用该点进行填充操作。

标签: python image-processing python-imaging-library pillow


【解决方案1】:

有几种方法可以做到这一点。你可以像我这里做的那样,用洋红色填充轮廓之外的所有区域,然后将所有不是洋红色的区域变为黑色,然后将所有人工洋红色的像素恢复为白色。

我在代码中散布了中间图像,但你可以抓住所有的代码片段并将它们收集在一起,以获得一个工作代码块。

#!/usr/bin/env python3

from PIL import Image, ImageDraw
import numpy as np

# Open the image
im = Image.open('octagon.png').convert('RGB')

# Make all background (exterior to octagon) pixels magenta (255,0,255)
ImageDraw.floodfill(im,xy=(0,0),value=(255,0,255),thresh=200)
# DEBUG
im.save('intermediate.png')

# Make everything not magenta black
n  = np.array(im)
n[(n[:, :, 0:3] != [255,0,255]).any(2)] = [0,0,0]

# Revert all artifically filled magenta pixels to white
n[(n[:, :, 0:3] == [255,0,255]).all(2)] = [255,255,255]

Image.fromarray(n).save('result.png')

或者,您可以用洋红色填充所有背景,然后找到一个白色像素并使用该白色像素作为种子填充黑色。您选择的方法取决于图像的预期颜色,以及您希望保留抗锯齿的程度等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2014-02-12
    相关资源
    最近更新 更多