让我们说你有这个图像
并给出指令以编程方式仅在其内部着色适当的颜色,但程序不仅要处理此形状和其他基元,而且要处理任何轮廓形状,无论它是多么复杂或有阴影或不。
这是我试图解决的问题,但是这就是我被困住的地方,看起来应该很简单地教一台电脑看黑线和它们内部的颜色。但搜索主要是特征脸样式识别算法,在我看来,这种算法过于拟合,而且至少比这个问题的基本形式所需的复杂程度要高得多。
我想将此作为一个监督学习分类器问题,其目的是为我的模型提供一个完整的图像,它将输出较小的numpy
数组,其中包含的像素类别为object
或background
。但是为了做到这一点,我需要给它训练数据,对我来说,似乎我需要手工标记训练集中的每个像素,这显然违背了程序的目的。
现在你有了背景,这是我的问题,给定这个图像,是否有一种有效的方法来获得两个不同的数组,每个数组包含不包含任何纯黑色的所有相邻像素(RGB(0,0,0) )) 像素?
哪一个会设置圆圈内部的所有像素,另一个设置圆圈外部的所有像素
答案 0 :(得分:1)
您可以使用scipy.ndimage.measurements.label
为您完成所有繁重的工作:
import scipy.ndimage
import scipy.misc
data = scipy.misc.imread(...)
assert data.ndim == 2, "Image must be monochromatic"
# finds and number all disjoint white regions of the image
is_white = data > 128
labels, n = scipy.ndimage.measurements.label(is_white)
# get a set of all the region ids which are on the edge - we should not fill these
on_border = set(labels[:,0]) | set(labels[:,-1]) | set(labels[0,:]) | set(labels[-1,:])
for label in range(1, n+1): # label 0 is all the black pixels
if label not in on_border:
# turn every pixel with that label to black
data[labels == label] = 0
这将填充图像中所有封闭的形状,考虑到图像边缘切割的形状不能关闭