VironZizu 2 Report post Posted September 18, 2014 Ребят, а по советуйте метод бинаризации, чтобы немного блеклые края букв все таки не уходили, использую Отсу, но варианты где немного картинка засвечивается при сканировании не очень бинаризуются... Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 18, 2014 Есть вариант применить перед бинаризацией какой-нибудь анизотропный фильтр. см. Bilateral filter, guided filter, anisotropic diffusion. Билатеральный в OpenCV имеется, надо только параметры правильно подобрать. Есть еще хитрый увеличитель картинок: И вот еще одна моя реализация: Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted September 18, 2014 Можешь ещё попробовать применить CLAHE, тоже есть в OpenCV. Он правда больше для визуального восприятия, но, возможно, и тебе поможет. Share this post Link to post Share on other sites
iskees 32 Report post Posted September 19, 2014 Ребят, а по советуйте метод бинаризации, чтобы немного блеклые края букв все таки не уходили, использую Отсу, но варианты где немного картинка засвечивается при сканировании не очень бинаризуются... Мне для распознавания символов больше всего подошел Christian, правда его нет в OpenCv. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted September 19, 2014 Не мудрено что Отцу плохо работает, ведь он вычисляет 1 порог собирая статистику со всего изображения, т.е. это глобальная бинаризация. (плохо работает в случаях если с одного конца документа например пересвет или затемнение) А надо использовать локальную. http://fiji.sc/Auto_Local_Threshold а вообще это всё пляски с константами, надо использовать обучаемую сегментацию. Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 22, 2014 С этапом бинаризации более менее разобрался, применил Адаптивную, она как то лучше с градиентными картинками справляется! И решил я тут отталкиваться от позиции паспорта, т.е. найти его на картинке, задача оказалась не тривиальной. Мой алгоритм ищет все прямоугольные области, потом отсеивает по размеру нужную. Алгоритм нахождения прямоугольников брал здесь: 0. rectangles <- {} 1. image <- load image 2. for every channel: 2.1 image_canny <- apply canny edge detector to this channel 2.2 for threshold in bunch_of_increasing_thresholds: 2.2.1 image_thresholds[threshold] <- apply threshold to this channel 2.3 for each contour found in {image_canny} U image_thresholds: 2.3.1 Approximate contour with polygons 2.3.2 if the approximation has four corners and the angles are close to 90 degrees. 2.3.2.1 rectangles <- rectangles U {contour} Но отрабатывает этот алгоритм только в случае если паспорт положить по центру сканера, если положить в притык к кромке, то все, сам прямоугольник паспорта не находится в принципе. По советуйте пожалуйста, что в этой ситуации можно сделать? Вчера весь день потерял на это) Может искать на изображении не прямоугольники, а что то другое, по чему можно отследить позицию паспорта?) Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted September 23, 2014 Для текста на однородном фоне часто используют гистограммы по строкам и по столбцам. То есть после бинаризации (можно и до): 1. создай одномерный массив размером с число строк изображения; 2. найди сумму пикселей в каждой строке и присвой соответствующему элементу массива; 3. нормализуй результат; 4. выведи его. Будут пики и провалы, которые точно соответствуют положению текста и границам паспорта. Такую же процедуру повтори для столбцов. Далее надо найти минимумы и максимумы гистограмм, провести отрезки, соответствующие им на изображении. По точкам пересечения можно точно получить координаты как самого паспорта, так и текста внутри него. Единственное, о чём надо помнить: паспорт либо сам должен лежать практически идеально ровно под сканером, без поворотов и изгибов, либо надо предварительно искать его границы и выравнивать. Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 23, 2014 Я видимо не совсем так расписал!) Мне нужно на отсканированном изображении, найти сам паспорт Вот пример: Мой алгоритм вроде находит, но стоит положить паспорт к кромке сканера, алгоритм перестает работать... Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 23, 2014 Нарисуйте рамку в пару пикселей вокруг изображения (после Canny), должно помочь. PS: Блюррить изображения довольно плохой способ защиты http://svg.dmi.unict.it/iplab/imagej/Plugins/Forensics/OpticalDeblur/Optical%20deblur.html http://www.pcworld.com/article/2032916/review-smartdeblur-restores-blurred-images-indulges-csi-fantasies.html https://github.com/Y-Vladimir/SmartDeblur Share this post Link to post Share on other sites
mrgloom 242 Report post Posted September 23, 2014 вообще в opencv был пример find rect(или как то так), основанный на нахождение 4-х линий методом преобразования Хоуга (Hough) ,а потом ищут их пересечение, и смотрят близок ли угол к 90. тут правда используется approxPoly http://www.emgu.com/wiki/index.php/Shape_(Triangle,_Rectangle,_Circle,_Line)_Detection_in_CSharp http://opencv-code.com/tutorials/automatic-perspective-correction-for-quadrilateral-objects/ хотя тут легче просто отделить от фона по цвету(если он отличается от цвета паспорта) и найти прямоугольный блоб. или так http://stackoverflow.com/questions/23234515/find-and-draw-largest-rect-opencv Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 23, 2014 Smorodov Сейчас попробую! Стабильно находит всегда верхний прямоугольник, т.е. область где описано кем и когда выдан, единственно, получается не всегда прямоугольник)) так как угол может быть допустим замят!) не знаю как эту задачку решить) p/s/ а про блюр не знал, спасибо!)) сразу все по удалял со страху)) mrgloom С Хоугом по игрался немного, нужные мне линии он отказался находить, реализовал через approxPoly! Проблемы возникают когда паспорт рядом с кромкой кладешь! Вот сейчас опробую совет Smorodova!) Правда остается проблема, если уголки страницы загнуты! Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 23, 2014 Ребят, такой вопрос, если у меня паспорт допустим лежит под углом небольшим, у меня есть линия, по которой можно выровнять изображение, как это можно сделать? Rotate то я делать умею, а вот как угол узнать? Если у меня есть координаты границ паспорта? Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 24, 2014 Через atan2, phi=atan(dy,dx); выдаст угол в радианах, opencv при составлении матрицы поворота, как мне помнится, использует градусы, так что не забудьте перевести. Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 25, 2014 Smorodov Спасибо за наводку про atan2! Все отлично получилось) Дальше решил развивать мысль, если паспорт положили к верх ногами, как это определить? На данный момент у меня такая мысля: Мой алгоритм находит прямоугольную область, где находятся поля: паспорт выдан, дата выдачи. Печать и роспись ещё, в общем эту страничку находит. Думаю если паспорт лежит в правильном положении, то эта область должна быть сверху! Если соответственно паспорт перевернут, то эта область должна быть снизу!) Но это какое то решение в лоб)) опять буду привязываться к константам... Может у контуров ещё есть какие нибудь интресные свойства по которым можно от сортировать нужный мне?) или можно не по контурам а по конкретным точкам, но опять же, непонятно как... только привязываться к конкретным цифрам, а так не хочется Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 25, 2014 И еще такой вопрос у меня появился, вот поворот изображения то я сделал, а как повернуть на этот же угол найденные мной координаты паспорта? А то не хочется их терять и заново алгоритмы поиска запускать! Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 25, 2014 По поводу поворота: https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%BF%D0%BE%D0%B2%D0%BE%D1%80%D0%BE%D1%82%D0%B0 По поводу верх / низ, можно ведь находить лицо Подетектил, не нашел, перевернул, опять подетектил. Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 26, 2014 Про матрицу поворота спасибо! Нашел шикарный способ как с её помощью нужные мне точки повернуть!)) А вот про поиск лица я как то и не задумывался раньше, сейчас опробую, тут в примере есть, самому интересно!)) Другое дело, что как обычно наверняка кроме лица еще кучу мусорных обектов найдет)) Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 26, 2014 Так надо самый большой объект искать (с флагом что то типа findLargestObject). Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 26, 2014 Собственно как и ожидалось, выдал кучу ложных областей, причем они были ничуть не меньше нужной, да и выполнялся он 1.5сек, а это уже перебор наверное, алгоритм и так уже 4 сек отрабатывает!)) боюсь что дальше будет)) Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 26, 2014 1.5 секунды много, обычно реалтайме работает. Можно уменьшить изображение, искать только в верхней левой четверти. Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 29, 2014 Вроде как сделал переворот, но как то он мне не нравится, не красиво реализован чтоли, пока так кончено оставлю, но в планы себе запишу более удачно реализовать! Ребят, а такой вопрос, реально каскады Хаара обучить на нахождение паспорта на скане? Чисто случайно наткнулся на него, очень интересный вариант, просто время реализовать уже нет. Прочитал пару статей на хабре, очень занимательно! Может уже есть где-нибудь обучные xml? пока только на лица находил и на автомобильные номера. На лица у меня отрабатывает так себе, много мусора, так может с прямоугольными областями у него лучше получится?) Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted September 29, 2014 Конечно реально. Я как-то обучал каскады на поиск банковских карточек, а там всё поосложней. Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 30, 2014 А есть какой нибудь материал по обучению? в идеале на русском)) У меня есть пример реализации Хаара, но там xml файл лица ищет) а мне бы паспорта, может удасться переобучить)) и у него удасться даже наклоненные документы находить? прям грани показывать будет? или получится только приблизительная область с паспортом? Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted September 30, 2014 Материала на русском полно, достаточно погуглить. Наклоненные паспорта будет искать только лишь если ты в достаточном количестве включишь их в обучающую выборку. Грани показывать не будет, только лишь примерный прямоугольник. Share this post Link to post Share on other sites
VironZizu 2 Report post Posted September 30, 2014 Тогда в поиске паспорта смысла нет его применять... Share this post Link to post Share on other sites