PHP: Как распознать, является ли изображение фотографией или нет - PullRequest
0 голосов
/ 28 октября 2018

Я хочу создать функцию php, которая может распознавать, если данное изображение («реальное») фотография или какая-то графика, рисунок, живопись, клипарт, мультфильм и т. Д. (=> " графика"для краткости).

Мне все равно, если фотография будет изменена (фотошоп), я просто хочу знать" родной "тип изображения (фотография или графика).Я знаю, что некоторая трехмерная компьютерная графика может выглядеть как реальные фотографии, и я готов принять ее - я понимаю, что в этом случае очень трудно добиться полностью успешного распознавания.

Я использую php7.0 только с собственными расширениями php (GD).Для следующего текста предположим, что проверенный файл изображения всегда является файлом JPG.

Мои тестовые изображения:

imageA.jpg - фотография автомобиля

imageB.jpg - графика с насыщенными цветами и деталями

1) Моей первой попыткой была проверкаизображение для данных EXIF, но для меня это не очень полезный подход, поскольку многие изображения не содержат данных EXIF.Во многих случаях данные EXIF ​​удаляются путем обработки в программном обеспечении для редактирования, в других случаях они могут быть удалены намеренно.

2) Моя вторая попытка (вдохновленная этим ответом) заключалась в подсчете количества используемых цветов, поскольку существует предположение, что фотография содержит больше отдельных цветов, чем графика.Я создал простую функцию, которая возвращает количество используемых цветов.Но потом я понял, что это не учитывает общее количество пикселей - большее (по размерам) изображение имеет больше «места» для разных цветов, поэтому несправедливо сравнивать изображения с разными размерами.

Так что ясоздали эту функцию с изменением размера изображения (до 250x250 пикселей):

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 = 54 377 цветов

Таким образом, он возвращает больше цветов для imageB.jpg (графика), чем для imageA.jpg (Фото).Вероятно, это будет работать для простой графики, но почти бесполезно для более сложной графики, как моего тестируемого изображения.

Затем я также попытался подсчитать и сравнить пропорцию наиболее часто встречающихся цветов изображения собщее количество пикселей, предполагая, что графика обычно содержит несколько цветов, которые являются доминирующими, но это также не сработало (фотография пляжа может содержать много синих пикселей) ...

Я читал, чтотакое распознавание возможно с помощью анализа гистограммы или анализа контрастности краев ( здесь или здесь ), но я не знаю, возможно ли это в php + gd.

У вас есть предложения?Есть ли решение, как распознать фото в php с приличной вероятностью (не менее 90% + правильные догадки)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...