使用 Python-Pillow 填充图像
种子填充也称为洪水填充,是一种用于识别特定封闭区域中连接路径的算法。该算法具有一系列实际应用,例如 -
- 优化寻路
- Paint Bucket Tool 是在多个图像处理包中发现的通用工具,内部使用该算法
- Mazesolving 使用 Floodfill(与广度优先、深度优先等遍历算法和 A Star、Dijkstra 等寻路算法配对)
- 用于图像处理
可以通过多种方式实现该算法,例如-
- 扫描线填充(基于行/列的填充)
- 四/八路填埋场
- 阈值较少的 Floodfill(仅使用相同的像素值)
我们将利用洪水填充算法来完成图像处理任务。为此,我们将使用pillow
库。要安装库,请在命令行中执行以下命令:-
pip install pillow
注意:一些 Linux 发行版倾向于预装Python和 Pillow
Syntax: ImageDraw.floodfill(image, seed_pos, replace_val, border-None, thresh=0)
Parameters:
image – Open Image Object (obtained via Image.open, Image.fromarray etc).
seed_pos – Seed position (coordinates of the pixel from where the seed value would be obtained).
replace_val – Fill color (the color value which would be used for replacement).
border – Optional border value (modifies path selection according to border color)
thresh – Optional Threshold Value (used to provide tolerance in floodfill, to incorporate similar valued pixel regions)
Return: NoneType (modifies the image in place, rather then returning then modified image)
例子:
使用的图像:
# Importing the pillow library's
# desired modules
from PIL import Image, ImageDraw
# Opening the image (R prefixed to
# string in order to deal with '\'
# in paths)
img = Image.open(R"sample.png")
# Converting the image to RGB mode
img1 = img.convert("RGB")
# Coordinates of the pixel whose value
# would be used as seed
seed = (263, 70)
# Pixel Value which would be used for
# replacement
rep_value = (255, 255, 0)
# Calling the floodfill() function and
# passing it image, seed, value and
# thresh as arguments
ImageDraw.floodfill(img, seed, rep_value, thresh=50)
# Displaying the image
img.show()
输出:
解释:
- 在导入任务所需的必要模块后,我们首先创建一个图像对象(
'PIL.Image.Image'
)。此图像对象充当图像文件的单独核心副本,可以单独使用。 - 然后为种子变量分配一个坐标值(图像的内部尺寸)。坐标是手动选取的,即用户应该输入有意选取的坐标值(像素坐标值可以通过使用
img.getpixel(coord)
来验证)。 - 从这些坐标获得的像素值将是图像内部要替换的像素值。
- 然后
rep_value
变量分配一个 RGB 颜色值(在本例中为黄色)。该值被分配为 RGB 元组,这对于我们的特定情况是特定的,因为我们的输入图像是 RGB 颜色空间(img.mode == 'RGB'
)。注意: rep_value 变量将根据当前图像的图像模式包含值,即如果
img.mode == "L"
则 rep 值将不是具有 3 个分量的元组,而是整数。 - 然后通过传递 img、seed、rep_value 和 thresh 作为参数调用
ImageDraw.floodfill()
函数。由于ImageDraw.floodfill()
函数在原地修改了传递的图像对象,因此我们不需要存储函数的返回值(Nonetype)。 - 最后,我们使用
img.show()
( Image.show() ) 显示修改后的图像。