Как определить, имеет ли изображение простой фон, используя значения HSV?

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

С результатами imagecolorat() я смог получить цвет RGB точек. Затем я преобразовал их в HSV.

Как я могу определить, похожи ли цвета? Поскольку фотографии могут не обязательно иметь точные цвета в пикселях образца, мне нужно установить некоторый уровень допуска, чтобы разрешить похожие цвета< /сильный>. Например, #3A34B9 и #524EB4 должны быть в порядке, потому что они просто синие с разными значениями HSV, но находятся рядом друг с другом.

Что я должен проверять в значениях HSV? Иногда серые объекты имеют очень отчетливый оттенок, но они по-прежнему оба серые и должны пройти тест.

Я не публикую какой-либо код прямо сейчас, потому что у меня проблемы не с кодом, а с алгоритмом как я могу правильно определить, какие фотографии имеют простой фон, а какие нет.

На самом деле это не распознавание лиц, и мне интересно, возможно ли это с PHP, но также поможет знание того, как я могу улучшить точки выборки из загруженной фотографии. В настоящее время я делю фотографию только на области и получаю точки из определенных областей (около 1/6 и 5/6 оси X и 1/3 оси Y).


person Greenback Boogie    schedule 28.11.2012    source источник


Ответы (1)


почему бы не сравнить значения RGB вместо преобразования их в HSV? Вы можете получить отдельные значения «R», «G» и «B» путем битового сдвига и маскирования результата imagecolorat(). Получив эти значения, их легко сравнить со значениями rgb тестового цвета. Мне также легко встроить какой-то допуск, поскольку каждый rgb находится в диапазоне от 0 до 255. Вы можете легко определить, насколько значения R, G и B могут отличаться от вашего тестового цвета.

из руководства по php imagecolorat()

<?php
$im = imagecreatefrompng("php.png");
$rgb = imagecolorat($im, 10, 15);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;

var_dump($r, $g, $b);
?>
person kasper Taeymans    schedule 28.11.2012
comment
Почему вы предлагаете использовать RGB вместо HSV? - person Greenback Boogie; 28.11.2012
comment
Вопрос в том, почему он преобразует цвет RGB в HSV? Я думаю, что RGB более интуитивно понятен при сравнении цветов. Если вам нужно больше красного, вам просто нужно увеличить значение R. Цветовая модель RGB работает так же, как смешивание красок в реальной жизни. Цветовая модель HSV более сложная, а значит, и алгоритм сравнения этих цветов будет более сложным. Мне нравится быть простым, что не означает, что цвета HSV не могут быть полезны (например, создание градиентов)! - person kasper Taeymans; 30.11.2012