Найдите лучший регион интереса после обнаружения края в OpenCV

Я хотел бы применить OCR к некоторым изображениям 7 сегментных дисплеев на стене. Моя стратегия такова:

  • Covert Img в оттенки серого
  • Размытие img для уменьшения ложных границ
  • Порог img для двоичного img
  • Применить обнаружение Canny Edge
  • Установить область интереса (ROI) на шаблон, заданный силуэтом числа
  • Масштаб ROI и Шаблон соответствуют области.

Как установить ROI, чтобы моя программа не искала шаблон по всему изображению? Я хотел бы установить базу ROI на количество найденных краев или что-то более полезное, если кто-то может мне помочь.

Я изучал классификацию Каскада и Хаар, но я не знаю, как применить его к моей проблеме.

Вот изображение после предварительной обработки и обнаружения края: an image after being pre-processed and edge detected

оригинальное изображение

enter image description here

Ответ 1

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

Изменить: О'кей немного менее наивные подходы. Если у вас есть какие-то априорные знания, например, вы знаете, что фотография хорошо выровнена (и не сильно повернута или перекошена), вы можете сделать несколько проходов с решеткой с низким высоким уровнем низких частот, настроенной для захвата краев с обеих сторон сегмент, используя разные шкалы как в размерах x, так и y. Хороший удар в обоих направлениях даст подсказки не только о ROI, но и о том, какой масштаб шаблона начать (слишком большие и слишком маленькие решетки сразу не ударяют оба края).

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

Ответ 2

Прежде всего, учитывая, что исходное изображение имеет светодиодный дисплей, и поэтому освещенная область имеет более высокую интенсивность, чем trest, я бы произнесла преобразование цвета Yuv на исходном изображении, а затем работаю с плоскостью интенсивности (У).

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

 sobelx = cv2.Sobel( img, cv2.CV_64F, 1, 0, ksize=5 )
 sobely = cv2.Sobel( img, cv2.CV_64F, 0, 1, ksize=5 )

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

Далее я построил бы горизонтальную и вертикальную гистограммы выхода из этих ребер или контуров. Это поможет вам идентифицировать "занятые" области изображения, которые содержат много ребер.

Наконец, я бы породил плоскость Y и исследовал каждый из ROI с помощью моего шаблона.