与往常一样,有一个用于此的内置 PHP 函数。只是开玩笑。=)
我见过的所有平面图都是单色的,我认为您可以使用颜色的数量和颜色饱和度来很好地猜测图像是徽标还是平面图。
例如:is the image has less than 2 or 3 colors is a floor plan.
例如:if the sum / average of the saturation is less than X it's a floor plan.
黑色和白色(以及平面图中使用的其他类似颜色)的饱和度为零或非常接近于零,而徽标往往更具视觉吸引力,因此使用更饱和的颜色。
这是一个计算 Hex RGB 颜色饱和度的简单函数:
function Saturation($color)
{
$color = array_map('hexdec', str_split($color, 2));
if (max($color) > 0)
{
return (max($color) - min($color)) / max($color);
}
return 0;
}
var_dump(Saturation('000000')); // black 0.0000000000000000
var_dump(Saturation('FFFFFF')); // white 0.0000000000000000
var_dump(Saturation('818185')); // grey 0.0300751879699249
var_dump(Saturation('5B9058')); // green 0.3888888888888889
var_dump(Saturation('DE1C5F')); // pink 0.8738738738738738
var_dump(Saturation('FE7A15')); // orange 0.9173228346456692
var_dump(Saturation('FF0000')); // red 1.0000000000000000
var_dump(Saturation('80FF80')); // --- 0.4980392156862745
var_dump(Saturation('000080')); // --- 1.0000000000000000
使用imagecolorat()和imagecolorsforindex()您可以实现一个简单的函数,该函数循环遍历图像的所有像素并求和/计算饱和度的平均值。如果图像的饱和度高于您定义的自定义阈值,则可以假定图像是徽标。
你不应该忘记的一件事是,具有更高分辨率的图像通常会有更多的饱和度(更多的像素总和),所以为了这个算法和你的服务器性能,调整所有图像的大小是明智的。图像以通用分辨率(例如 100x100 或 50x50)对它们进行分类,一旦分类,您就可以使用原始(未调整大小的)图像。
我用您提供的图像做了一个简单的测试,这是我使用的代码:
$images = array('./44199.jpg', './68614.jpg', './95205.jpg', './logo.png', './logo.gif');
foreach ($images as $image)
{
$sat = 0;
$image = ImageCreateFromString(file_get_contents($image));
for ($x = 0; $x < ImageSX($image); $x++)
{
for ($y = 0; $y < ImageSY($image); $y++)
{
$color = ImageColorsForIndex($image, ImageColorAt($image, $x, $y));
if (is_array($color) === true)
{
$sat += Saturation(dechex($color['red']) . dechex($color['green']) . dechex($color['blue']));
}
}
}
echo ($sat / (ImageSX($image) * ImageSY($image)));
echo '<hr />';
}
结果如下:
green floor plant: 0.0151028053
black floor plant: 0.0000278867
black and white logo: 0.1245559912
stackoverflow logo: 0.0399864136
google logo: 0.1259357324
仅使用这些示例,如果平均饱和度小于 0.03 或 0.035,我会说图像是地面植物,您可以通过添加额外示例进一步调整它。