确定图像文件是照片还是图形?
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
百分比转义 宏导致计算并返回identify
ed 文件中唯一颜色的数量。以下是我自己的本地文件的一些示例:
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 文件?