我有一个二进制图像(见下文),我想将中心大点内的所有点标记为1(白色)。如果我理解正确,最好的方法是使用泛洪填充算法;你建议使用任何Python模块吗?如果没有,你将如何构建脚本?
谢谢!
答案 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)在scikit
:http://scikit-image.org/docs/dev/auto_examples/segmentation/plot_label.html