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

use*_*122 6 gd photo imagemagick graphic web

我正在着手我认为可能有点像实验......

提出(或发现,因为它可能已经存在)一种方法来确定给定的图像文件,无论格式如何,是照片还是图形.

"照片"意思是风景,人物等.VS "图形"意为图标,插图,图表,UI截图等.

我在过去一周想出了一个很好的PHP/ImageMagick脚本,它从图像文件中提取统计数据,很好地将修正应用于白平衡,色调,振动,清晰度,阴影/高光.

现在我想更进一步:自动检测照片内容,然后应用上述处理.

到目前为止,一种一致工作的方法是确定图像是否具有EXIF数据,但这仅适用于JPEG.不过,这当然不是万无一失的.

是否有任何已知的方法通过ImageMagick,GD或其他方式检测"照片"与"图形"?

如果需要,我有能力在我们的网络服务器上安装/运行除ImageMagick和GD之外的应用程序.

谢谢!

Kur*_*fle 4

照片中往往有很多不同的单独颜色(数千、万和十万)。其他图形倾向于使用有限数量的独特颜色(几十到几百)。

因此,ImageMagick 命令可能能够帮助对大量文件进行分类:

 identify -format '%k\n'        file
 identify -format '%f :  %k\n'  file1 file2 file3 file4
Run Code Online (Sandbox Code Playgroud)

特殊的%kIMidentify 百分比转义宏会导致计算并返回 ed 文件中唯一颜色的数量identify。以下是我自己的本地文件的一些示例:

 identify -format '%k' logo.png
    257

 identify -format '%k' testimage.png 
  20913
Run Code Online (Sandbox Code Playgroud)

对本地目录中的一组 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
Run Code Online (Sandbox Code Playgroud)

警告:使用矢量绘图应用程序(例如 inkscape)生成的复杂渐变也可能会产生许多独特的颜色......