7

给定一个图像,例如 CakePHP 徽标,如何将这个图像转换回带有图层的 PSD。作为人类,我可以很容易地弄清楚如何将其转换回具有图层的 PSD。我可以看出背景是带有星形边缘的圆形。所以圆形星形部分在后面,蛋糕图像在上面,CakePHP 字样在这两个图像之上。

我可以使用 Photoshop/Gimp 工具将这些图像分成三个图像并填充中间的区域。然后我有三层。

在此处输入图像描述

作为人类,很容易计算出大多数徽标和图像的分层,并且许多图像具有多个层次,CakePHP 徽标只是一个示例。现实世界中的图像也有层次感,在草的背景上可能会有树的层次。我需要一种从图像转换回分层表示的通用方法,理想情况下是一种软件解决方案。

在没有程序解决方案的情况下,是否有任何论文或研究解决了这个问题或与这个问题相关?我最感兴趣的是将人类构建的图像(例如徽标或网站标题)转换回分层表示。


我想指出这样做的一些好处,如果您可以自动将此图像转换为分层表示,那么修改图像会更容易。例如,也许你想让蛋糕变小,如果计算机已经在红色背景上分层了蛋糕,你可以缩放蛋糕层。这允许在还没有图层信息的网站上对图像进行图层调整。

4

2 回答 2

4

当您从图层表示转换为图像时,您会丢失信息。例如,您不知道蛋糕后面背景层的像素值。此外,您不确定图像的哪个部分属于哪个图层。

然而,在某些情况下,至少部分地恢复或估计此信息是可能的。例如,您可以尝试使用分割算法将图像分成“层”。在您的示例中,基于颜色的简单分割可能会起作用。

至于在背景中恢复丢失的像素值,有一种所谓的修复技术,它试图根据图像的包围来估计图像中的丢失区域。

最后,要恢复图像中文本的位置和内容,您可以依靠光学字符识别(OCR) 方法。

请记住,没有比看起来更复杂的简单算法来解决您的问题。但是,使用上述信息,您可以尝试至少部分自动化您的问题。

于 2012-10-10T12:29:41.760 回答
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)

但是,即使在这里,我们也必须根据属于蒙版的像素数来描述什么是“重要的”(在某种程度上我们可能会错过一些颜色)。我们可以开始对相似的颜色进行聚类——但是在什么密度下聚类变得重要?如果它不仅仅是纯色,而是有质感,我们该如何描述呢?或者,推断一层是另一层的一部分,或者在它前面呢?或者,最终,某些层似乎是我们人类所说的“字母”,因此可能都应该是相关的……

计算机视觉中的许多分割研究通常试图解决这个问题并在一个可以有效编码和应用这些先验知识的框架内改进它......

于 2012-10-12T14:58:25.530 回答