仅着色形状的内部

时间:2016-04-12 22:31:23

标签: python algorithm numpy machine-learning computer-vision

让我们说你有这个图像

Circle

并给出指令以编程方式仅在其内部着色适当的颜色,但程序不仅要处理此形状和其他基元,而且要处理任何轮廓形状,无论它是多么复杂或有阴影或不。

这是我试图解决的问题,但是这就是我被困住的地方,看起来应该很简单地教一台电脑看黑线和它们内部的颜色。但搜索主要是特征脸样式识别算法,在我看来,这种算法过于拟合,而且至少比这个问题的基本形式所需的复杂程度要高得多。

我想将此作为一个监督学习分类器问题,其目的是为我的模型提供一个完整的图像,它将输出较小的numpy数组,其中包含的像素类别为objectbackground。但是为了做到这一点,我需要给它训练数据,对我来说,似乎我需要手工标记训练集中的每个像素,这显然违背了程序的目的。

现在你有了背景,这是我的问题,给定这个图像,是否有一种有效的方法来获得两个不同的数组,每个数组包含不包含任何纯黑色的所有相邻像素(RGB(0,0,0) )) 像素?

哪一个会设置圆圈内部的所有像素,另一个设置圆圈外部的所有像素

1 个答案:

答案 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

这将填充图像中所有封闭的形状,考虑到图像边缘切割的形状不能关闭