Обнаружение линий на изображении с использованием OpenCV с Python

[Обновлен вопрос в конце] Я пытаюсь определить шаблон дизайна простых геометрических фигур в изображении 640x480. Я разделил изображение на блоки 32х32 и проверил, в каком блоке находится центр каждой фигуры.

На основе этого расчета я создал пустую матрицу (160x120) нулей (float32) с col=640/4 row=480/4 Каждый раз, когда фигура найдена, вычисляется центр и проверяется, в каком блоке она найдена. Соответствующий элемент вместе с его 8 соседями в массиве numpy 160x120 установлены в 1. В конце концов, массив nupy 160x120 представлен в виде изображения в градациях серого с черным фоном и белыми пикселями, представляющими блоки обнаруженных форм.

Как показано на рисунке ниже. Изображение в верхнем левом углу представляет собой массив с размерами 160x120

Изображение в верхнем левом углу представляет собой массив с размерами 160x120. Нет проблем до сих пор.

Как вы видите, недавно сгенерированное изображение имеет белую линию на черном фоне. Я хочу найти rho,theta,x0,y0,x1,y1 для этой строки. Поэтому я решил использовать преобразование HoughLines для этого.

Для следующим образом:

edges = cv2.Canny(np.uint8(g_quadrants), 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
print lines

Вот g_quadrants матрица 160x120, представляющая изображение в оттенках серого, но вывод cv2.HoughLines не содержит ничего, кроме None,

Пожалуйста, помогите мне с этим.

Обновить:

Реальный сценарий

Небольшое окно с черно-белым изображением (np.float32, относящимся к GrayScale), отображающим белое, - это то, что я получаю, когда

  • Разделите 640x480 на 32x32 блоков
  • Найдите треугольники на изображении
  • Создайте матрицу 32x32, чтобы отобразить результаты для каждого блока
  • Обновите соответствующий матричный элемент на 1, если в блоке найден треугольник

Увеличенный вид:

Увеличенный вид изображения 32x32 np.float32

Вы можете видеть, что есть белые пиксели, формирующие прямую линию. Может быть некоторые нежелательные обнаружены. Мне нужно устранить ненужные одиночные пиксели и восстановить непрерывную прямую линию. Это может быть достигнуто путем расширения, а затем размывания изображения. Мне нужна находка x0, y0, x1, y1, rho, theta этой линии.

Их может быть несколько строк. В этом случае мне нужно найти две верхние строки по длине.

1 ответ

Вы хотите найти бар с треугольниками, верно?

  1. threshold
  2. findContours
  3. boundingRect и отфильтрованы по некоторым правилам

Другие вопросы по тегам