Обнаружение края в изображениях, на самом деле довольно просто. Наиболее стандартным способом является использование операции image convolution и выбор правильного ядра для перемещения по вашему изображению. В php.gd
есть функция, которая называется imageconvolution
, где вы можете указать входное изображение, ядро свертки, делитель и смещение. Этот делитель просто делит все значения в ядре на это значение, а смещение добавляет значение к каждому значению в ядре. Таким образом, при условии, что ваше изображение загружается в массив $im
, вы могли бы сделать это:
$edgeMatrix = array(-1,-1,-1,-1,8,-1,-1,-1,-1);
$divisor = 0;
$offset = 0;
imageconvolution($im, $edgeMatrix, $divisor, $offset);
Обратите внимание, что imageconvolution
мутирует оригинальное входное изображение, так $im
будет содержать край обнаружен результат. Убедитесь, что у вас есть копия исходного изображения где-нибудь в случае необходимости.
$edgeMatrix = array(-1,-1,-1,-1,8,-1,-1,-1,-1);
является стандартом Laplacian convolution matrix и используется довольно часто для задач обнаружения кромок.
Однако есть функция под названием imagefilter
, где есть флаг обнаружения края - IMG_FILTER_EDGEDETECT
. Эта функция фильтрует изображение с одним из нескольких параметров, и обнаружение края является одним из этих параметров. Таким образом, вы могли бы сделать это:
imagefilter($im, IMG_FILTER_EDGEDETECT);
Как imageconvolution
, imagefilter
также мутирует входное изображение, поэтому снова убедитесь, что вы держите исходное изображение где-то, если вам это нужно.
Надеюсь, один из них будет работать на вас!
У меня нет опыта работы с PHP, но определение области очень просто. Все, что вам нужно сделать, - подсчитать количество белых пикселей для каждого объекта. Теперь, чтобы определить, является ли объект с наибольшей площадью кругом или нет, вы можете использовать формулу здесь из этого сообщения: http://stackoverflow.com/questions/24802059/removing-square-objects - Формула утверждает, что объект, который является круглым, имеет отношение, близкое к 1, тогда как некруглые объекты имеют отношение, которое намного ниже. Вы можете установить порог, чтобы определить, является ли форма круговой или нет. – rayryeng
@rayryeng благодарю вас за ваше решение. Как вы вычисляете площадь каждого объекта отдельно? Подсчет белых пикселей даст кумулятивную область для всех объектов. – Vish
Я не сказал, чтобы вычислить площадь ** всех ** объектов вместе - вы вычисляете площадь каждого объекта отдельно. php.gd имеет очень простой способ манипулирования изображениями. Что вам нужно сделать, это выполнить привязку подключенных компонентов - http://homepages.inf.ed.ac.uk/rbf/HIPR2/label.htm - Это дает уникальную метку для каждого уникального объекта. Оттуда вы можете просмотреть все уникальные ярлыки и найти их общие области. У меня нет знаний в PHP, поэтому я не знаю никаких библиотек, которые вы могли бы сделать с помощью ....но, надеюсь, вы можете найти что-то, что связано с подключенными компонентами и php.gd. – rayryeng