Intereting Posts
PHP Curl, получение IP-адреса сервера Можно ли отформатировать число до 2 десятичных знаков с помощью Smarty PHP Сделать URL-адрес, чувствительный к SEO, (исключить идентификатор). Включая общий html-заголовок на всех страницах сайта на 20 страницах (с активным классом) В чем разница между «include_once» и «require_once» в PHP? Получить последнюю пару ключ-значение в массиве PHP Как уловить фатальную ошибку: Максимальное время выполнения 30 секунд превышено в PHP Запрос Mysql вставляет новую строку Как сделать PDO (pdo_pgsql) для ленивой выборки строк Как найти недостающую стоимость между двумя таблицами Mysql PHP обновить изображение Как вывести это значение JSON, где ключ начинается с числа? расположение таблицы – foreach вызов метода DoReferenceTransaction, приводящего к ошибке как создать безопасную систему регистрации php, позволяющую использовать функцию «сохранить меня в системе»?

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

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

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

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

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

alt textalt text

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

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

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

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

  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: else $ bMarkFound = false;
  4. Если $ cCur.color == $ cBack.color, $ horizMarkArray [] = массив ($ iMarkPosStart, $ iMarkPosStart + $ iMarkWidth, $ iMarkWidth);
  5. продолжать до конца ширины
  6. Если is_empty ($ horizMarkArray) повторяется со следующей горизонтальной строкой
  7. .. и через 11. Повторите для высоты / вертикали, с помощью $ vertMarkArray []

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

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

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