У меня есть изображение, и у меня есть частичная линия на изображении. Они все время горизонтальные или вертикальные линии. Я не знаю цвета линии, ни ширины линии.
Как я могу использовать PHP для обнаружения такой строки?
Как вы видите в загруженном изображении, есть разделы 3×3, которые мне нужно нарезать. Мне нужны 3 вертикальные и 3 горизонтальные секции, чтобы нарезать части. Обратите внимание, что в области содержимого есть прямоугольник с некоторыми марками, который является частью изображений.
Мы можем использовать эти маркеры для получения координат.
Вам лучше использовать маркеры, сравнив первый и последний N пикселей каждой строки, если они имеют одинаковый цвет / длину. Это будет более эффективным, чем анализ всех пикселей в каждой строке.
Вы должны проверить правильность отображения строк и столбцов. Вы, скорее всего, будете использовать imagecolorat()
. Перебирайте все столбцы и строки. Если два (или любой произвольный предел) или более пикселей имеют одинаковые (или очень близкие) цвета, они составляют линию.
Определенно используйте метки , иначе это сложная проблема.
Чтобы использовать метки, вам просто нужно найти их позиции. Чтобы сделать это, начните с краев, возьмите последовательные полосы с одним пикселем и найдите периодические отклонения. Классический и довольно простой способ сделать это – использовать автокорреляцию. Поскольку ваши оценки настолько четкие (т. Е. Очень мало, если есть шум), вы можете найти еще более простой способ, например, среднее значение пикселя для всей полосы и все, что отличается от этого более чем небольшим количеством, – это отметка ; или, сделайте гистограмму ваших значений пикселей, и она должна иметь две резкие удары, один большой удар для фона и небольшой рельеф для ваших меток и т. д. Но какой бы подход вы ни использовали, найдите метки, и все готово.
На шаге 4 и 8 вы можете выполнить любое усреднение, обнаружение шума и т. Д. На шагах 7 и 11 вы можете повторить предыдущие шаги и усреднить $ iMarkWidth, чтобы избежать ошибок наложения в верхней части строки. В этом случае вы останавливаете:
Вы можете попробовать выполнить обнаружение кромок, а затем использовать преобразование Хафа для обнаружения линий. Проблема в вашем случае заключается в том, что ребра, соответствующие линиям, очень слабы. С другой стороны, вам нужно искать вертикальные и горизонтальные линии, поэтому вы можете сильно ограничить проблему.