确定图像文件是照片还是图形?

8
我正在进行一项实验,希望能够找到(或者已经存在)一种方法来确定给定的图像文件是否为照片还是图形,而不考虑其格式。
“照片”指的是风景、人物等,而“图形”则指图标、插图、图表、UI截图等。
在过去的一周中,我想出了一个不错的PHP/ImageMagick脚本,可以从图像文件中提取统计信息,并很好地应用于白平衡、色调、亮度、锐度和阴影/高光方面的修复。
现在,我想更进一步:自动检测照片内容,然后应用上述处理。
目前为止,有一种方法比较可靠,就是确定图像是否具有EXIF数据,但这仅适用于JPEG格式。当然,这并非绝对可靠。
是否有任何已知的方法,可以通过ImageMagick、GD或其他方式来检测“照片”和“图形”?
如果需要,我可以在我们的Web服务器上安装/运行除ImageMagick和GD之外的应用程序。
谢谢!
1个回答

4

照片通常会有许多不同的颜色(数千、数万和数十万种)。其他图形则倾向于使用有限数量的独特颜色(几十到几百种)。

因此,ImageMagick命令可能有助于处理大量文件:

 identify -format '%k\n'        file
 identify -format '%f :  %k\n'  file1 file2 file3 file4

特殊的%k IM identify 百分号转义 宏会计算并返回 identify 文件中独特颜色的数量。以下是我本地文件的几个示例:
 identify -format '%k' logo.png
    257

 identify -format '%k' testimage.png 
  20913

将其运行在本地目录中包含15张 4032x3024 大小的照片上,结果如下(每张照片计算颜色需要超过2秒):

time identify -format '%f :  %k\n' *.JPG
  P4061782.JPG :  285127
  P4061783.JPG :  304247
  P4061784.JPG :  230241
  P4061785.JPG :  277545
  P4061786.JPG :  300632
  P4061787.JPG :  325916
  P4061788.JPG :  301766
  P4061789.JPG :  300821
  P4061790.JPG :  265080
  P4061791.JPG :  348247
  P4101941.JPG :  323714
  P4101942.JPG :  359688
  P4101943.JPG :  338563
  P4101944.JPG :  308578
  P4101945.JPG :  291853

   real  0m34.257s
   user  0m33.301s
   sys   0m0.678s

警告:使用矢量绘图应用程序(例如Inkscape)生成的复杂渐变也可能产生大量唯一的颜色……


有趣的想法,尽管我刚刚尝试了将一个保存为PNG格式的JPEG照片进行处理,但总颜色数仅为253,这使它看起来更像是一种PNG类型的图像而不是照片。我在思考是否可以通过分辨率来计算预期文件大小,例如一个具有惊人小尺寸的JPEG可能隐藏着一个PNG,而大型PNG文件大小可能表明它是一张图片。 - Lukos

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