使用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
您需要稍微调整一下,但它应该可以工作。
从灰度图像中去除大阴影区域的最佳方法是什么。我正在努力编写一种方法,该方法采用 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
您需要稍微调整一下,但它应该可以工作。