Flood填充二进制图像中的形状

时间:2014-01-22 15:51:25

标签: python image flood-fill

我有一个二进制图像(见下文),我想将中心大点内的所有点标记为1(白色)。如果我理解正确,最好的方法是使用泛洪填充算法;你建议使用任何Python模块吗?如果没有,你将如何构建脚本?

谢谢!

The image I am working with

2 个答案:

答案 0 :(得分:1)

这是一个非常天真的洪水填充方法(使用你的问题中详细描述的0和1,但不是读取图像,但使用硬编码数据)绕过python中缺乏TCO。也许它可以给你一些想法:

#! /usr/bin/python3

d = '''111110001111101
110000011100000
111000010111001
111100100111111
111100000111111
111110111111111'''

def flood(grid, x, y):
    toBeFilled = {(x, y)}
    while toBeFilled:
        tbf = set()
        for x, y in toBeFilled:
            try:
                if grid[y][x]: continue #Pixel is already 1 -> no action
            except IndexError: continue #Index is out of bounds
            grid[y][x] = 1 #set Pixel to white
            for xoff, yoff in ((1, -1), (1, 0), (1, 1), (0, -1), (0, 1), (-1, -1), (-1, 0), (-1, 1)):
                tbf |= {(x + xoff, y + yoff)} #add adjacent pixels
        toBeFilled = tbf

def pprint(grid):
    print('-' * 20)
    for line in grid: print(''.join(str(i) for i in line))
    print('-' * 20)

d = [[int(c) for c in line] for line in d.split('\n')]
pprint(d)
flood(d, 4, 1)
pprint(d)

输出是:

--------------------
111110001111101
110000011100000
111000010111001
111100100111111
111100000111111
111110111111111
--------------------
--------------------
111111111111101
111111111100000
111111111111001
111111111111111
111111111111111
111111111111111
--------------------

答案 1 :(得分:0)

由于输入图像是二进制的,因此可能的方法是 a)使用ndimage.binary_fill_holes填充blob内的空点 b)在scikithttp://scikit-image.org/docs/dev/auto_examples/segmentation/plot_label.html

的基础上构建此示例后的组件标签