Изучение принципа работы OCR-систем и работы классификаторов символов. Выбор алгоритма работы классификатора, позволяющего достаточно точно определять рукописные символы и при этом экономно использовать системные ресурсы. Реализация программного модуля.
При низкой оригинальности работы "Разработка программного модуля с использованием технологии OCR", Вы можете повысить уникальность этой работы до 80-100%
Разработка программного модуля с использованием технологии OCRВ последние десятилетия были развиты новые методы обработки изображений и распознавания образов, благодаря чему возможно создание таких промышленных систем распознавания печатного текста, как например, FINEREADER. Работа современной OCR-программы, в общем, выглядит следующим образом: на вход системы поступает отсканированное изображение текста, которое, в первую очередь, очищается от шумов, далее, выделив на изображении объекты, которые могут оказаться буквами, система вычисляет для каждого из них определенный набор параметров (таких, например, как плотность черных точек по диагонали). В зависимости от того, для какого эталона разница параметров окажется наименьшей, система принимает решение, каким символом следует считать обнаруженный объект. Этап сравнения метрик символов с эталонами называется классификацией символов, и будет подробно рассмотрен в данной работе. Следовательно, к OCR-системе для Android предъявляются жесткие требования к использованию ресурсов, из чего следует, что реализация полноценной промышленной системы распознавания символов, работающей офлайн невозможна.В 70-х годах компания Kurzweil Computer Products предприняла качественно новый шаг в развитии OCR, создав систему, способную учиться распознавать шрифты. Разработчики предоставили в распоряжение программы свыше 10 тыс. образцов начертания каждой буквы, и, обобщая их, система получала представление об основных закономерностях начертания знака, что и позволяло обходиться без длительного обучения. Как правило, в таких системах правильным считается символ, чья гипотеза набрала максимальный суммарный рейтинг. Объект наивысшего уровня только один - страница, на следующей ступени иерархии располагаются таблица и текстовый блок, затем ячейка таблицы, абзац или изображение, за ними следует строка, потом слово или изображение внутри строки и, наконец, нижний уровень - символ. Поэтому задачей модуля сегментации на уровне букв в разработанном алгоритме является нахождение возможных границ символов внутри буквы, а окончательное решение о разбиении слова принимается на последнем этапе обработки, с учетом идентификации отдельных фрагментов изображения как букв.И, несмотря на то, что в данный момент разработка под Android ведется на многих языках, для реализации OCR-системы был выбран язык Java, так как на нем написан Android SDK, упрощающий разработку, и требующиеся библиотеки, о которых будет подробно рассказано в последующих главах. Допустим, у нас есть изображение какого-то текста, это может быть фотография, сканированное изображение или скриншот, и на этом изображении необходимо отыскать какую-то фразу или слово в максимально короткий срок, чтобы быстро извлечь необходимую часть информации, здесь на помощь нам приходят алгоритмы обработки изображений и распознавания. Метод для получения скриншота, вызываемый по нажатию на кнопку: private void TAKESCREENSHOT() {//Для уникальности файлов используется текущее время Date now = new Date(); //Форматирование даты/времени по образцу android.text.format.DATEFORMAT.format("yyyy-MM-dd_hh:mm:ss", now); try {//Получение пути для сохранения изображений и подготавливаем файл String path = Environment.GETEXTERNALSTORAGEDIRECTORY().TOSTRING() "/" now ".jpg"; File IMAGEFILE = new File(path); //Нахождение части layout"a, в которой находится ключевое слово и текст View v1 = FINDVIEWBYID(R.id.main_content_layout); //Получение изображения v1.SETDRAWINGCACHEENABLED(true); Bitmap bitmap = Bitmap.CREATEBITMAP(v1.GETDRAWINGCACHE()); v1.SETDRAWINGCACHEENABLED(false); //Сохранение изображения в файл FILEOUTPUTSTREAM OUTPUTSTREAM = new FILEOUTPUTSTREAM(IMAGEFILE); int quality = 100; bitmap.compress(Bitmap.COMPRESSFORMAT.PNG, quality, OUTPUTSTREAM); OUTPUTSTREAM.flush(); OUTPUTSTREAM.close(); //Переход к следующей Activity OPENSCREENSHOTACTIVITY(now); } catch (Throwable e) {e.PRINTSTACKTRACE(); } } Пример кода, для перевода цветного пикселя в яркость: /Цикл обхода матрицы цветных пикселей pixels (size = количество пикселей = width*height изображения) for (int i = 0; i <size; i ) {int color = pixels[i]; //получаем значение красного канала int r = Color.red(color); //получаем значение зеленого канала int g = Color.green(color); //получаем значение синего канала int b = Color.blue(color); //вычисляем полутоновую яркость по формуле перехода RGB to YUV double luminance = (0.299 * r 0.0f 0.587 * g 0.0f 0.114 * b 0.0f); } Метод, осуществляющий перевод в полутоновое и бинаризацию изображения: public void BINARIZEBYTHRESHOLD(String IMAGEPATH, int threshold) {//Открываем изображение по его пути Bitmap bitmap = BITMAPFACTORY.DECODEFILE(IMAGEPATH); //Получаем размеры изображения int width = bitmap.GETWIDTH(); int height = bitmap.GETHEIGHT(); int size = width * height; //Получаем матрицу пикселей изображения int[] pixels = new int[size]; bitmap.GETPIXELS(pixels, 0, width, 0, 0, width, height); bitmap.
Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность своей работы