使用Python-Pillow填充图像
种子填充也被称为洪水填充 ,是一种用于识别明确的封闭区域内的连接路径的算法。该算法有一系列的实际应用,例如–
- Optimized pathfinding
- 油漆桶工具是在几个图像处理软件包中发现的通用工具,在内部使用该算法
- 解决迷宫的方法是使用泛函(与广度优先、深度优先等遍历算法和A星、Dijkstra等寻路算法搭配)。
- 在图像处理中使用
有多种方法可以实现该算法,例如–
- Scanline Floodfill (row/column based floodfill)
- 四/八道防洪区
- 阈值减去淹没(只使用相同的像素值)。
我们将利用floodfill算法来完成图像处理任务。为了这个目的,我们将使用pillow库。要安装该库,请在命令行中执行以下命令:-
pip install pillow
注意:几个Linux发行版往往都预装了Python和Pillow。
语法: ImageDraw.floodfill(image, seed_pos, replace_val, border-None, thresh=0)
参数:
image – 打开的图像对象(通过Image.open、Image.fromarray等获得)。
seed_pos – 种子位置(将获得种子值的像素的坐标)。
replace_val – 填充颜色(将用于替换的颜色值)。
border – 可选的边界值(根据边界颜色修改路径选择)。
thresh – 可选的阈值(用于在泛滥中提供容忍度,以纳入类似价值的像素区域)。
返回: NoneType (在原地修改图像,而不是返回修改后的图像)
示例:
使用的图片:
# 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 Tuple,这对于我们的特殊情况来说是特定的,因为我们的输入图像是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())显示修改后的图片。