如何从图像(jpg、png等)中提取图层

7
给定一个图片比如CakePHP的标志,如何将这个图片转换回带有图层的PSD文件呢?作为人类,我可以很容易地想出如何将其转换为带有图层的PSD文件。我可以看出背景是一个具有星形边缘的圆形形状。因此,圆形星形部分位于后面,蛋糕图像在其上方,CakePHP字样覆盖在这两个图像之上。
我可以使用Photoshop / Gimp工具将这些图像分成三个图像,并填充它们之间的区域。然后我就有了三个图层。
作为人类,大多数标志和图像的分层都很容易理解,许多图像有多个图层,CakePHP标志只是一个例子。现实世界中的图像也有分层,可能会有一个树层在草地背景上。我需要一种通用的方法将图像从单层转换回多层表示,最好是软件解决方案。
如果没有编程解决方案,是否有任何论文或研究解决了此问题或与此问题相关?我主要感兴趣的是将人类构建的图像(例如标志或网站标题)转换回分层表示。
我想指出这样做的一些好处,如果您可以自动将此图像转换为多层表示,则更容易修改该图像。例如,也许您想使蛋糕变小,如果计算机已经对红色背景上的蛋糕进行了分层,则可以仅缩放蛋糕层。这允许在没有图层信息的网站上对图像进行图层调整。

嗯… 有趣的问题。我只想指出Cake中的“k”非常明显地表示z-order。但是,如何提取用于“Cake”的文本层使用红色描边(特别是“C”),但在“e”中几乎完全不明显呢?而且我认为没有依据可以判断“PHP”是在“Cake”上方还是下方的层上。 - Larry OBrien
2个回答

4
当您从图层表示转换为图像时,会丢失信息。例如,您不知道蛋糕后面的背景图层像素的值。此外,您不确定图像的哪个部分属于哪个图层。
然而,在某些情况下,可能可以恢复或至少部分估计这些信息。例如,您可以尝试使用分割算法将图像分离成“图层”。在您的示例中,基于颜色的简单分割可能有效。
至于恢复背景中丢失的像素值,有所谓的修补技术,它试图根据其周围的内容来估计图像中缺失的区域。
最后,要恢复图像中文本的位置和内容,可以依靠光学字符识别(OCR)方法。
请记住,没有简单的算法可以解决您的问题,该问题比看起来更加复杂。但是,使用上述信息,您可以尝试自动化您的问题至少部分地解决。

4
如前所述,这是一项不简单的任务。可以用最简单的话来描述:给定由像素N组成的图像(或真实照片的场景),如何将它们分配到M层?
对于分割而言,关键在于您能够提供什么样的先验知识,以确定像素及其组合的哪些属性能够“提示”(我使用这个词是有意的!)它们属于哪一层。
即使考虑最简单的情况——只使用图像中的颜色,也可以生成这5个“层”(对应色调值为0、24、90、117和118):

1 2 3 4 5

以下是使用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)

但即使在这里,我们也不得不用属于掩模的像素数量来描述“重要性”(以至于我们可能会错过一些颜色)。我们可以开始聚类类似的颜色 - 但密度达到什么程度时才能成为一个重要的聚类?如果不是单纯的颜色,而是有纹理的呢,我们如何描述这个问题?或者,有些图层被推断为是另一个图层的一部分,或者在其前面,最终有一些图层似乎是我们人类称之为“字母”,因此可能都相关...

计算机视觉中分割的大量研究通常尝试将这个问题放在一个能够有效编码和应用这个先验知识的框架内进行改进...


嗨,Tim,这是什么脚本?我的意思是,用的是什么编程语言、什么工具、什么库? - Phil
1
我猜它是使用OpenCV的Python。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接