我是图像分割的新手,但我需要这样做才能获得机器学习分类器的数据库。
基本上我有一个类似于这张图片的视频:
我的工作是识别前景中的奶牛,或者至少识别任何奶牛。我意识到有一个遮挡问题,但对于一个起动器我想要正确地分割一个孤独的牛,就像它周围的红色矩形(手绘)。
在不那么具有挑战性的问题中,例如,我通过为每个像素添加一个阈值来区分,该阈值对于对象变为(0,0,0)或对于背景变为(255,255,255):
然后我用相同的值标记像素以获取类,并获得足够大的'blob'的矩形。
对于上面的图像,这种方法不起作用,因为物体和背景相似+有很多阴影,侧面照明等,所以我不知道如何接近它。欢迎任何建议。
答案 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/)。理想情况下,差异化的'图像将隔离牛。从那里你可以得到想象并尝试各种边缘检测算法等...
希望有所帮助。