2016-01-22 3 views
0

Учитывая изображение, состоящее из простого черного поля с одним белым прямоугольником внутри него где-то, как я могу извлечь координаты прямоугольника? я googled и googled и нашел множество статей о обнаружении края, используя линии hough, свертку, морфологию и т. д., но все они фактически ограничивают изображение или каким-то образом преобразуют его. я не хочу менять изображение, все, что я хочу сделать, это найти, где находятся края.php - как найти координаты ребер в изображении с помощью воображения или другой библиотеки?

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

ответ

1
$base = new Imagick(realpath('./trim.png')); 
$base->trimImage(0); 
// get the new image size 
$geometry = $base->getImageGeometry(); 
// Retrieve the trim info 
$pageInfo = $base->getImagePage(); 

Аналогичный пример на странице руководства: http://php.net/manual/en/imagick.trimimage.php#111332

+0

Hm - 12.9k репутация и только код ответа? Mhhh, было бы неплохо, если бы вы могли добавить несколько слов. ([Из обзора] (http://stackoverflow.com/review/low-quality-posts/10996110)) –

+1

@CharlotteDunois Я ответил на 109 вопросов с меткой «Imagick» для общего количества upvote ... 84. Некоторые из этих ответов заняли много часов, чтобы написать. Не следует удивляться тому, что мои ответы могут быть краткими. – Danack

+0

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

0

оказывается полное решение проблемы, как Размещенное следующим образом:

$im->trimImage(0); 
$pagedata = $im->getImagePage(); 
$x = $pagedata['x']; 
$y = $pagedata['y']; 
$im->setImagePage(0, 0, 0, 0); 
$w = $im->width; 
$h = $im->height; 

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

оказалось, что решение еще проще, если вы работаете с изображением, использующим прозрачность; это просто getImagePage() функция одна:

$im = new Imagick(realpath('./image.png')); 
$pagedata = $im->getImagePage(); 
$x = $pagedata['x']; 
$y = $pagedata['y']; 
$w = $pagedata['width']; 
$h = $pagedata['height']; 
print("x,y: $x, $y<br>\n"); 
print("w,h: $w, $h<br>\n"); 

по какой-то причине, если trimImage(0) используется с этим прозрачным изображением, (х, у) координаты установлены на (-1, -1). к сожалению, я не знаю достаточно о том, чтобы вообразить, почему это происходит. может быть, вы могли бы ответить на это, @ danack?

 Смежные вопросы

  • Нет связанных вопросов^_^