使用 Python 和枕头 (PIL) 填充空心形状

Tho*_*ger 6 python image-processing python-imaging-library pillow

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

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

八角形

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()
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ell 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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

# 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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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