Намерете най-добрия регион на интерес след откриване на ръбове в OpenCV

Бих искал да приложа OCR към някои снимки на 7 сегментни дисплеи на стена. Моята стратегия е следната:

  1. Скрито изображение в скала на сивото
  2. Замъглете изображението, за да намалите фалшивите ръбове
  3. Праг на изображението до двоично изображение
  4. Прилагане на откриване на Canny Edge
  5. Задайте регион на интерес (ROI) въз основа на модел, даден от силуета на числото
  6. Мащабът ROI и шаблонът съответстват на региона

Как да задам ROI, така че програмата ми да не трябва да търси шаблона през цялото изображение? Бих искал да задам базата си за ROI въз основа на броя намерени ръбове или нещо по-полезно, ако някой може да ми помогне.

Разглеждах Cascade Classification и Haar, но не знам как да го приложа към моя проблем.

Ето изображение след предварителна обработка и разпознаване на ръбове: изображение след предварителна обработка и разпознаване на ръбове

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

въведете описание на изображението тук


person locorecto    schedule 21.02.2012    source източник
comment
можеш ли да добавиш и оригинално изображение?   -  person Abid Rahman K    schedule 21.02.2012


Отговори (2)


Ако това е представително за броя на ръбовете, с които ще трябва да се справите, можете да опитате хубава наивна стратегия като плъзгане на прозорец за търсене на ROI през двоичното изображение, което просто сумира стойностите на пикселите и не се задейства, освен ако тази стойност не е над праг. Това трябва да оптимизира всички празни повърхности.

Редактиране: Добре, някои по-малко наивни подходи. Ако имате някакви предварителни познания, например знаете, че снимката е добре подравнена (и не е зле завъртяна или изкривена), бихте могли да направите няколко преминавания с ниска-висока-ниска-висока решетка, настроена да улавя ръбовете от двете страни на сегмент, използвайки различни мащаби както в измеренията x, така и в y. Доброто попадение и в двете посоки ще даде указания не само за ROI, но и какъв мащаб на шаблона да започнем (твърде големите и твърде малките решетки няма да ударят двата ръба наведнъж).

Можете да направите откриване на петна и след това да приложите вашите шаблони към петна на свой ред (връщайки се към сливане на петна, ако резултатът за съвпадение на шаблона е под праг, в случай че вашият числов сегмент е случайно разделен). Размерът на петното отново може да ви даде известна подсказка за мащаба на шаблона, който да приложите.

person dabhaid    schedule 21.02.2012
comment
Това беше един от първоначалните ми планове. Бих искал да видя дали има нещо по-малко наивно, което би могло да ми помогне. - person locorecto; 22.02.2012

Първо, като се има предвид, че оригиналното изображение има LED дисплей и така осветената област е с по-висок интензитет от треста, бих изпълнил, да кажем, цветова трансформация на Yuv върху оригиналното изображение и след това да работя с равнината на интензитета (Y) .

След това, ако знаете, че изображението е добре подравнено (т.е. не е завъртяно), бих предложил да приложите отделни хоризонтални и вертикални детектори за ръбове, а не общ детектор за ръбове (не се интересувате от диагонални линии). напр.

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

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

След това бих конструирал хоризонтални и вертикални хистограми на изхода от тези откривания на ръбове или контури. Това ще ви помогне да идентифицирате „натоварените“ области на изображението, които съдържат много ръбове.

И накрая, щях да определя прага на равнината Y и да изследвам всяка от ROI с моя шаблон.

person Dave Durbin    schedule 05.05.2015