我想创建一个php函数,该函数可以识别给定的图像是(“真实”)照片还是某种图形,绘图,绘画,剪贴画,卡通等(=>“ 图形”(简称)。
我不在乎照片是否被修改(photoshopped),我只想知道图像(照片或图形)的“本机”类型。我知道有些3D计算机图形看起来像真实的照片,我已经准备好接受它了-我知道在这种情况下要获得完全成功的识别非常困难。
我仅将php7.0与本机php扩展名(GD)一起使用。对于下一个文本,我们假设选中的图像文件始终是JPG文件。
我的测试图像:
imageA.jpg-汽车图片
imageB.jpg-具有丰富色彩和细节的图形
1)我的第一个尝试是检查图像中的EXIF数据,但这对我来说不是一个非常有用的方法,因为很多图像都不包含EXIF数据。在许多情况下,EXIF数据会通过在编辑软件中进行处理而被删除,在其他情况下,则可以有意地将其删除。
2)我的第二次尝试(受this的启发)是计算使用的颜色数,因为有一个假设,即照片包含的颜色比图形更多。 我创建了一个简单的函数,该函数返回使用的颜色数。但是后来我意识到,这并没有考虑到像素的总数-较大(在尺寸上)的图像对于不同的颜色具有更多的“空间”,因此比较具有不同尺寸的图像是不公平的。
因此,我使用图像大小调整(到250x250px)创建了此功能:
function get_image_colors($content){
$img = imagecreatefromstring($content);
$small = imagecreatetruecolor(250, 250);
imagecopyresampled($small, $img, 0, 0, 0, 0, 250, 250, imagesx($img),imagesy($img));
$img=$small;
$w = imagesx($img);
$h = imagesy($img);
ob_start();
imagegd2($img, null, $w);
$data = ob_get_clean();
$totalLength = strlen($data);
$pixelDataLength = $w * $h * 4;
$headerLength = $totalLength - $pixelDataLength;
$counts = array();
for($i = $headerLength; $i < $totalLength; $i += 4) {
$pixel = substr($data, $i, 4);
$count =& $counts[$pixel];
$count += 1;
}
$colorCount = count($counts);
return $colorCount;
}
它(缓慢地)工作,但是结果不是很有用:
imageA.jpg = 37,050种颜色
imageB.jpg = 54377种颜色
因此,与 imageA.jpg (照片)相比, imageB.jpg (图形)返回的颜色更多。它可能适用于简单的图形,但是对于更复杂的图形作为我的测试图像几乎没有用。
然后,我还尝试计算并比较图像中最常见的颜色与总像素数的比例,假设图形通常包含一些占主导地位的颜色,但它也不起作用(海滩的照片可能包含很多蓝色像素)...
我已经阅读到这种识别可以通过直方图分析或边缘对比度分析(here或here)来实现,但是我不知道在php + gd中是否可以实现。
您有什么建议吗?有什么解决方案如何以适当的概率(至少90%以上的正确猜测)识别php中的照片?