Как определить частичную вертикальную / горизонтальную линию на изображении? - PullRequest
1 голос
/ 10 ноября 2010

У меня есть изображение, и у меня есть частичная линия на изображении.Они все время горизонтальные или вертикальные линии.Я не знаю ни цвета линии, ни ширины линии.

Как я могу использовать PHP для обнаружения такой линии?

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

Мы можем использовать эти маркеры для получения координат.

alt text alt text

Ответы [ 5 ]

1 голос
/ 10 ноября 2010

Вам лучше использовать маркеры, сравнивая первый и последний N пикселей каждой строки, если они имеют одинаковый цвет / длину. Это будет более эффективно, чем разбор всех пикселей в каждой строке.

0 голосов
/ 11 ноября 2010

Вы можете попробовать выполнить определение края, а затем использовать Преобразование Хафа для обнаружения линий.Проблема в вашем случае заключается в том, что края, соответствующие линиям, очень слабые.С другой стороны, вам нужно только искать вертикальные и горизонтальные линии, чтобы вы могли сильно ограничить проблему.

0 голосов
/ 11 ноября 2010
  1. Найти цвет фона ($ cBack) из углового пикселя (скажем, в верхнем левом углу)
  2. В левом верхнем углу переместить цикл foreach (диапазон (1, imagesx ($ img_rsrc)), установка $ cCur.color = imagecolorat ($ img_asset, $ x, $ y);
  3. $ iMarkWidth + = 1; $ iMarkPosStart = $ cCur.x; до тех пор, пока вы не достигнете пикселя другого цвета ($cCur.color! = $ cBack.color), затем $ bMarkFound - true: еще $ bMarkFound = false;
  4. Если $ cCur.color == $ cBack.color, $ horizMarkArray [] = array ($ iMarkPosStart, $ iMarkPosStart + $ iMarkWidth, $ iMarkWidth);
  5. продолжить до конца ширины
  6. Если is_empty ($ horizMarkArray), повторить со следующей горизонтальной строкой
  7. .. и до конца11. Повторите эти действия для высоты / вертикали с $ vertMarkArray []

. На шагах 4 и 8 вы можете выполнить любое усреднение, обнаружение шума и т. Д. На шагах 7 и 11 вы можете повторить предыдущие шаги иусредните значение $ iMarkWidth, чтобы избежать ошибок слияния в верхней части строки. В этом случае вы останавливаетесь либо:

  • после N строк или
  • после $ iMarkWidth> {то, что явно шире любой строки}
0 голосов
/ 10 ноября 2010

Определенно используйте метки , в противном случае это сложная проблема.

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

0 голосов
/ 10 ноября 2010

Вы должны проверять изображение построчно и по столбцам.Скорее всего, вы будете использовать imagecolorat().Обведите все столбцы и строки.Если два (или любое произвольное ограничение) или несколько пикселей имеют одинаковые (или очень близкие) цвета, они составляют линию.

...