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

Posted

技术标签:

【中文标题】确定图像文件是照片还是图形?【英文标题】:Determine if an image file is a photo or a graphic? 【发布时间】:2014-07-29 22:38:50 【问题描述】:

我正在着手进行我认为可能有点像实验的事情......

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

“照片” 表示风景、人物等。 “图形”表示图标、插图、图表、UI 截图等。

我在过去一周想出了一个不错的 php / ImageMagick 脚本,它从图像文件中提取统计数据,并很好地修复了白平衡、色调、鲜艳度、锐度、阴影/高光。

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

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

因此 ImageMagick 命令可能有助于对大量文件进行分类:

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

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

 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 文件大小可能表示图像。

以上是关于确定图像文件是照片还是图形?的主要内容,如果未能解决你的问题,请参考以下文章

我应该将图像存储在哪里,以便可以与它们共享 iTunes 文件?

如何找到 Android 手机的相机图像文件夹?

图像处理软件erdas如何使用?

Tif格式图像在Arcmap为啥是黑色的?

如何使用 html 文件选择器(输入类型 =“文件”)将照片上传到 facebook(图形 api)

UG NX二次开发(C#)-文件-导出图像