我正在尝试编写一个方法来填充给定的形状,使其变为纯黑色。
实施例: 这个八角形最初只是一个轮廓,将变成一个坚实的黑色八边形,但只要所有边缘都闭合,这应该适用于任何形状。
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()
我已经阅读了10x以上的文档并找到了其他几种操作图像的方法,但是我找不到一个示例来填充图像中预先存在的形状。我看到使用floodfill()是一个选项,虽然我不知道如何抓住我想要填充的形状。
注意:我无权访问此任务的任何其他图像处理库。
答案 0 :(得分:0)
有几种方法可以做到这一点。您可以像我在这里所做的那样,用洋红色填充轮廓之外的所有区域,然后将所有不是洋红色的内容都变为黑色,然后将所有人造洋红色的像素恢复为白色。
我在代码中穿插了一些中间图像,但是您只需抓住所有代码位,然后将它们收集在一起,即可获得有效的代码块。
#!/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')
或者,您可以用洋红色填充所有背景,然后找到一个白色像素并使用该白色像素作为种子用黑色填充。选择的方法取决于图像的预期颜色以及希望保留抗锯齿的程度等。