Как всегда, для этого есть встроенная функция 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, вы можете немного подкорректировать его, добавив дополнительные примеры.