具有挑战性的图像分割:背景和对象相似

时间:2016-02-21 20:54:53

标签: python image image-processing image-segmentation scikit-image

我是图像分割的新手,但我需要这样做才能获得机器学习分类器的数据库。

基本上我有一个类似于这张图片的视频:

Cow with a rectangle

我的工作是识别前景中的奶牛,或者至少识别任何奶牛。我意识到有一个遮挡问题,但对于一个起动器我想要正确地分割一个孤独的牛,就像它周围的红色矩形(手绘)。

在不那么具有挑战性的问题中,例如,我通过为每个像素添加一个阈值来区分,该阈值对于对象变为(0,0,0)或对于背景变为(255,255,255):

Megasteak

然后我用相同的值标记像素以获取类,并获得足够大的'blob'的矩形。

对于上面的图像,这种方法不起作用,因为物体和背景相似+有很多阴影,侧面照明等,所以我不知道如何接近它。欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

我意识到这是一个老线程,但我想建议一个像这样的问题的方法。

您可以尝试使用基于纹理的分割,因为草背景具有与牛不同的纹理。

看看this link,其中图像的纹理能量特征是根据Laws的技术定义的。

这是Python中的法律技术的实现。它通过定义用于提取图像中的不同特征的2D内核来工作,例如边缘,涟漪,斑点及其组合。下面的函数返回9个图像,可以从中提取纹理特征。

def laws(array):

    # Define the 1D kernels
    L5 = np.array([1,4,6,4,1]) # level
    E5 = np.array([-1,-2,0,2,1]) # edge 
    S5 = np.array([-1,0,2,0,-1]) # spot
    R5 = np.array([1,-4,6,-4,1]) # ripples

    # Generate 2D kernels
    L5E5 = np.outer(L5,E5)
    E5L5 = np.outer(E5,L5)

    L5R5 = np.outer(L5,R5)
    R5L5 = np.outer(R5,L5)

    E5S5 = np.outer(E5,S5)
    S5E5 = np.outer(S5,E5)

    S5S5 = np.outer(S5,S5)

    R5R5 = np.outer(R5,R5)

    L5S5 = np.outer(L5,S5)
    S5L5 = np.outer(S5,L5)

    E5E5 = np.outer(E5,E5)

    E5R5 = np.outer(E5,R5)
    R5E5 = np.outer(R5,E5)

    S5R5 = np.outer(S5,R5)
    R5S5 = np.outer(R5,S5)


    return (0.5*(correlate(array, L5E5) + correlate(array, E5L5)), \
            0.5*(correlate(array, L5R5) + correlate(array, R5L5)), \
            0.5*(correlate(array, E5S5) + correlate(array, S5E5)), \
            correlate(array, S5S5), \
            correlate(array, R5R5), \
            0.5*(correlate(array, L5S5) + correlate(array, S5L5)), \
            correlate(array, E5E5), \
            0.5*(correlate(array, E5R5) + correlate(array, R5E5)), \
            0.5*(correlate(array, R5S5) + correlate(array, S5R5)))

答案 1 :(得分:0)

我会尝试拍两张照片。一张“静态”的照片。背景没有奶牛,然后第二张照片与一头牛。然后你可以减去这两个图像。我对python不太熟悉,但imagemagick可以轻松区分图像(http://www.imagemagick.org/Usage/compare/)。理想情况下,差异化的'图像将隔离牛。从那里你可以得到想象并尝试各种边缘检测算法等...

希望有所帮助。