使用numpy递归地将图像中的黑色变为白色

Recursively change black to white in image with numpy

从灰度图像中去除大阴影区域的最佳方法是什么。我正在努力编写一种方法,该方法采用 2d Numpy 数组 A 和 A 中的条目 (x,y),并且 "crawls" 通过数组更改任何 (x',y') 条目 "connected"到 (x,y) 从 0 到 255。我所说的连接的意思是从 (x,y) 到 (x',y') 有一些 0 值条目的路径。这是我的意思的图片。

底部的黑色区域应该全部设置为灰度 255。我几乎肯定这个算法应该是递归的,在 numpy 或使用 PIL 中有没有快速的方法来做到这一点?

编辑:

好的,谢谢你的建议,这是我能想到的;

def creep(data, x, y):
    data[x, y]=255 
    for (i,j) in [(1,0),(-1,0),(0,1),(0,-1)]:
        x, y = x + i, y + j 
        try:
            if data[x, y]==0:
                return creep(data, x, y)
        except:
            pass 
    return data 

def crop_big_region(data):
    """ Looks for black regions in image and makes them white """
    n, m = data.shape
    r = int(0.012*min(n,m)) 
    num_samples = int(0.0001*n*m)
    for _ in xrange(0,num_samples):
        x, y = numpy.random.randint(r,n - r), numpy.random.randint(r,m -r)
        if numpy.all(data[x-r:x+r, y-r:y+r] == 0):
            data[x,y] = 255
            data = creep(data, x, y)
    return data 

它似乎有点工作,除了它只是 returns 行,而不是填充整个区域。

我觉得我太累了,无法正确地弄清楚这里的递归步骤。

嗯 - 这不是真正的 "python related question" 更多的图像处理问题。

我想你可以有两个选择:
1.使用边缘检测,然后迭代看面积够大 例如看Image outline using python/PIL
2.使用OpenCV。不太了解 - 但这段代码似乎做了一些非常接近你想要实现的事情 Python: detect black squares

正如@Boaz 所指出的,与其说是 python 问题,不如说是图像处理问题。您可以使用所谓的 自适应阈值 获得所需的结果。 Scikits-image 有一个很好的实现可用,这里有完整的教程:

http://scikit-image.org/docs/dev/auto_examples/plot_threshold_adaptive.html

您需要稍微调整一下,但它应该可以工作。