Пример за внедряване на методи за обработка и разпознаване на изображения на Android

Като се занимавате с разработването на приложения за Android OS, възникват интересни идеи, които искате да опитате, или има някакъв набор от теоретични знания и искате да ги приложите на практика, идеята за описания проект възникна от комбинацията от тези фактори.

Пример за внедряване е представен като приложение за Android, а оригиналното изображение е екранна снимка на текста с въведена ключова дума; за решаване на проблема се използват различни алгоритми за обработка и разпознаване на изображения.

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

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

  • Запознаване с някои методи за обработка на изображения и разпознаване на образи;
  • Запознайте се с възможностите и сложността на прилагането на тези методи за Android.

Придобиване на изображение

За да получим изследваното изображение, създаваме дейност, която ще има само три елемента:

1. EditText – за въвеждане на ключова дума; 2. TextView - за показване на текста, в който трябва да намерите тази дума; 3. Бутон за правене на екранна снимка и превключване към друг екран.

! Целият код е само с демонстративна цел и не е подходяща инструкция за действие.

Ще изглежда нещо подобно:

пример

за търсене,например, нека въведем думата "мечти":

разпознаване

По този начин получаваме една ключова дума, последвана от текста по-долу. Струва си да се обърне внимание на факта, че ключовата дума и самият текст имат различен размер на шрифта (за да усложним задачата, да кажем така).

Щракнете върху бутона и вземете екранна снимка на областта с ключова дума и текст.

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

Предварителна обработка на полученото изображение

Първо трябва да конвертирате полученото цветно изображение в нива на сивото.

Преобразуване на изображение от цветно в сиво

За превод се използва схемата RGB към YUV.

В нашия случай е необходим само интензитет (яркост), който можете да получите от форума:

Y = 0,299*R + 0,587*G + 0,114*B, където R, G, B са съответно червени, зелени и сини канали.

За работа с цветове, колкото и да е странно, класът Color е полезен и по-специално неговите статични методи red, green и blue, които изпълняват операции с побитови смени за извличане на желания цветен канал от int цветовата стойност на пиксел.

Примерен код за преобразуване на цветен пиксел в яркост:

Сегментирането на изображение в скала на сивото не е много по-лесно, отколкото на цветно изображение, така че следващата стъпка е да преобразувате изображението в скала на сивото в двоично (стойностите за яркост на пикселите имат само две стойности 0 и 1).

Бинаризация на изображение в скала на сивото

В този проблем за бинаризация е достатъчен елементарен прагов метод с праг по подразбиране 128.

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

За да се получи двоична стойност на яркостта, се извършва проверка на получената преди това яркост на полутона:

Където threshold е прагът, Color.WHITE и Color.BLACK са константи за удобство, за да не се бъркат с 0 и 1.

След извършеното преобразуване в скала на сивото и по-нататъшна бинаризация, получаваме следния резултат:

разпознаване

Тъй като тези два метода за обработка на изображения са много близки, те се комбинират в един метод.

Сегментиране

За да намерите ключова дума, след бинаризация, е необходимо да извършите няколко етапа на сегментиране, които се състоят в търсене на редове в текста, търсене на думи в редове и присвояване на намерените думи на думите на кандидатите по броя на буквите (за стесняване на кръга от думи за разпознаване).

Сегментиране на редове

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

"Вградената" хистограма за яснота (вляво) изглежда например така:

внедряване

За удобство на дисплея хистограмата е нормализирана.

Когато знаете местоположението на линиите в изображението, можете да продължите към търсенето на думи.

Сегментиране на думи

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

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

Пример за получаване на такава хистограма е по-долу и е подобен на предишния.

Чрез обработката на тази хистограма можете да получите нова хистограма - празнини между черните пиксели, т.е. нейната първа градация ще бъде броят на "празнините" с ширина 1 пиксел, втората градация ще бъде броят на "празнините" с ширина 2 пиксела и т.н.

Ще получите нещо подобно:

пример

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

Имайки такава информация за "празнини" и линейна хистограма, е възможно да изберете области от изображението, където са разположени думи, както и да изчислите колко знака се съдържат в тези думи.

Вижте изходния код за пълния код за този процес.

За визуална оценка на работата на горния набор от алгоритми, думите в текста са боядисани в редуващи се цветове, а думите на кандидатите (нека ви напомня, тези, чийто брой знаци съвпада с броя на знаците в ключовата дума) остават черни:

пример

И така, на този етап има части от изображения (по-точно координатите на тези части), които съдържат ключовата дума и думите на кандидатите въз основа на броязнаци, можете да опитате да намерите ключова дума сред кандидатите.

Признание

Обръщам внимание, че тук под разпознаване се разбира разпознаване на ключова дума сред кандидатите, а за разпознаване от кои знаци се състои тя не може да става дума.

За разпознаване се избира набор от информативни характеристики: това може да бъде броят на крайните точки, възловите точки, както и броят на пикселите с 3, 4 и 5 черни съседни пиксела и др. Експериментално е установено, че голям брой знаци губят значението си, тъй като се "припокриват" един с друг.

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

За всяка дума се отчита броят на характеристиките, след което се извършва търсене на най-близкия съсед въз основа на евклидовото разстояние.

Относно всички характерни числа като A4, A8 и др. можете да намерите допълнителна информация.

Като се има предвид честотата на думите и грешките, в резултат на това можете да получите 2-3 най-близки съседи, сред които ще бъде намерена ключовата дума (маркирана в червено на фигурата).

обработка

Също така на снимката можете да видите, че сред червените думи има думата за търсене "мечти".

За да подобрите качеството на разпознаване, можете да опитате да изберете различен праг на бинаризация, както и да изберете други информационни функции, като добавите например сонди към тях.

Заключение

Поставените цели бяха постигнати, някои методи за обработка и разпознаване на изображения бяха тествани, докато тяхното внедряване за Android не създава допълнителни трудности, просто трябва да вземете предвид потреблението на памет и да не съхранявате няколко големи растерни изображения едновременно.

Надявам се, че информацията ще бъде полезна за начинаещи по пътя им към решаване на проблеми при работа с изображения под Android.

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

Целият проект е достъпен в GitHub

P.S.: Горното изпълнение на алгоритмите не е оптимално и изисква по-нататъшно развитие и оптимизиране, то служи само като минимално необходим пример за запознаване, визуализиране и оценка на горните методи на Android.

Hardcore conf в C++. Каним само професионалисти.