如前所述,这是一项不平凡的任务。最终,它可以最简单地表述为:给定由像素N组成的图像(或场景,如果是真实照片) ,如何将它们分配给M层?
对于分割,这完全是关于您可以使用的先验知识,即像素和像素组的哪些属性会给出关于它们所属层的“提示”(我建议使用这个词!)。
甚至考虑仅使用图像中的颜色的最简单情况。我可以生成这 5 个“层”(对于色调值 0、24、90、117 和 118):
使用此代码(在 python/opencv 中)
import cv
# get orginal image
orig = cv.LoadImage('cakephp.png')
# show original
cv.ShowImage("orig", orig)
# convert to hsv and get just hue
hsv = cv.CreateImage(cv.GetSize(orig), 8, 3)
hue = cv.CreateImage(cv.GetSize(orig), 8, 1)
sat = cv.CreateImage(cv.GetSize(orig), 8, 1)
val = cv.CreateImage(cv.GetSize(orig), 8, 1)
cv.CvtColor(orig, hsv, cv.CV_RGB2HSV)
cv.Split(hsv,hue,sat,val,None)
#cv.ShowImage("hue", hue)
# loop to find how many different hues are present...
query = cv.CreateImage(cv.GetSize(orig), 8, 1)
result = cv.CreateImage(cv.GetSize(orig), 8, 1)
for i in range(0,255):
cv.Set(query,i)
cv.Cmp(query,hue,result,cv.CV_CMP_EQ)
# if a number of pixels are equal - show where they are
if (cv.CountNonZero(result)>1000): # <-what is signficant?
cv.ShowImage(str(i),result)
cv.SaveImage(str(i)+".png",result)
cv.WaitKey(-1)
但是,即使在这里,我们也必须根据属于蒙版的像素数来描述什么是“重要的”(在某种程度上我们可能会错过一些颜色)。我们可以开始对相似的颜色进行聚类——但是在什么密度下聚类变得重要?如果它不仅仅是纯色,而是有质感,我们该如何描述呢?或者,推断一层是另一层的一部分,或者在它前面呢?或者,最终,某些层似乎是我们人类所说的“字母”,因此可能都应该是相关的……
计算机视觉中的许多分割研究通常试图解决这个问题并在一个可以有效编码和应用这些先验知识的框架内改进它......