Как лучше всего определить углы накладной / чека / листа бумаги на фотографии? Это должно использоваться для последующей коррекции перспективы перед OCR.
Мой нынешний подход был:
RGB> Серый> Обнаружение Canny Edge с установлением порога> Расширить (1)> Удалить мелкие объекты (6)> очистить объекты границы> выбрать большой блог на основе Convex Area. > [определение угла - не реализовано]
Я не могу не думать, что должен быть более надежный «интеллектуальный» / статистический подход для обработки этого типа сегментации. У меня не так много обучающих примеров, но я, вероятно, смог бы собрать вместе 100 изображений.
Более широкий контекст:
Я использую Matlab для создания прототипа и планирую реализовать систему в OpenCV и Tesserect-OCR. Это первая из ряда проблем обработки изображений, которые мне нужно решить для этого конкретного приложения. Итак, я собираюсь развернуть собственное решение и заново ознакомиться с алгоритмами обработки изображений.
Вот пример изображения, которое я бы хотел обработать с помощью алгоритма: Если вы хотите принять вызов, большие изображения находятся на http://madteckhead.com/tmp
(источник: madteckhead.com )
(источник: madteckhead.com )
(источник: madteckhead.com )
(источник: madteckhead.com )
В лучшем случае это дает:
(источник: madteckhead.com )
(источник: madteckhead.com )
(источник: madteckhead.com )
Однако он легко терпит неудачу в других случаях:
(источник: madteckhead.com )
(источник: madteckhead.com )
(источник: madteckhead.com )
Заранее спасибо за все отличные идеи! Я так люблю!
РЕДАКТИРОВАТЬ: прогресс преобразования Хафа
В: Какой алгоритм будет кластеризовать горизонтальные линии для поиска углов? Следуя советам из ответов, я смог использовать преобразование Хафа, выбрать линии и отфильтровать их. Мой нынешний подход довольно груб. Я сделал предположение, что счет-фактура всегда будет меньше 15 градусов от выравнивания с изображением. Я получаю разумные результаты для строк, если это так (см. Ниже). Но я не совсем уверен в подходящем алгоритме для кластеризации линий (или голосования) для экстраполяции углов. Линии Хафа не непрерывны. А на зашумленных изображениях могут быть параллельные линии, поэтому требуются метрики какой-либо формы или расстояния от начала линии. Любые идеи?
(источник: madteckhead.com )
Ответы:
Я друг Мартина, который работал над этим в начале этого года. Это был мой первый проект кодирования, и закончился он немного спешно, поэтому код нуждается в некотором ошибочном ... декодировании ... Я дам несколько советов из того, что я уже видел, что вы делаете, а затем отсортируйте мой код в мой выходной завтра.
Первый совет,
OpenCV
иpython
они классные, переходите к ним как можно скорее. : DВместо того, чтобы удалять мелкие объекты и / или шум, опустите хитрые ограничения, чтобы он принял больше краев, а затем найдите самый большой замкнутый контур (в OpenCV используйте
findcontour()
с некоторыми простыми параметрами, я думаю, что использовалCV_RETR_LIST
). может по-прежнему испытывать затруднения, когда он находится на белом листе бумаги, но определенно давал наилучшие результаты.Для
Houghline2()
Transform попробуйте использоватьCV_HOUGH_STANDARD
вместоCV_HOUGH_PROBABILISTIC
, это даст rho и theta , определяя линию в полярных координатах, а затем вы можете сгруппировать линии с определенным допуском к ним.Моя группировка работала как справочная таблица, для каждой строки, выведенной из преобразования hough, она давала пару ро и тета. Если эти значения были в пределах, скажем, 5% пары значений в таблице, они были отброшены, если они были вне этих 5%, в таблицу добавлялась новая запись.
Тогда вам будет намного проще анализировать параллельные линии или расстояние между линиями.
Надеюсь это поможет.
источник
Студенческая группа в моем университете недавно продемонстрировала приложение для iPhone (и приложение OpenCV на Python), которое они написали именно для этого. Насколько я помню, шаги были примерно такими:
Это работало довольно хорошо, и они смогли сделать снимок листа бумаги или книги, выполнить определение угла, а затем сопоставить документ на изображении на плоской плоскости почти в реальном времени (для выполнения была единственная функция OpenCV. отображение). Когда я увидел, что он работает, оптического распознавания текста не было.
источник
Вот что я пришел к выводу после небольшого экспериментирования:
Не идеально, но, по крайней мере, работает для всех образцов:
источник
for line in lines[0]: cv2.line(edges, (line[0], line[1]), (line[2], line[3]), (255,0,0), 2, 8) # finding contours contours, _ = cv2.findContours(edges.copy(), cv.CV_RETR_EXTERNAL, cv.CV_CHAIN_APPROX_TC89_KCOS) contours = filter(lambda cont: cv2.arcLength(cont, False) > 100, contours) contours = filter(lambda cont: cv2.contourArea(cont) > 10000, contours)
Вместо того, чтобы начинать с обнаружения краев, вы можете использовать обнаружение углов.
Marvin Framework предоставляет для этой цели реализацию алгоритма Moravec. Вы можете найти уголки бумаги как отправную точку. Ниже результат алгоритма Моравека:
источник
Также вы можете использовать MSER (Максимально устойчивые экстремальные области) над результатом оператора Собеля, чтобы найти стабильные области изображения. Для каждой области, возвращаемой MSER, вы можете применить аппроксимацию выпуклой оболочки и поли, чтобы получить что-то вроде этого:
Но этот вид обнаружения полезен для обнаружения в реальном времени более одного изображения, которое не всегда дает лучший результат.
источник
После обнаружения края используйте преобразование Хафа. Затем поместите эти точки в SVM (поддерживающую векторную машину) с их метками, если в примерах есть плавные линии на них, у SVM не возникнет проблем с разделением необходимых частей примера и других частей. Мой совет по SVM, поставьте такие параметры, как подключение и длина. То есть, если точки связаны и длинные, они, скорее всего, будут линией квитанции. Затем вы можете удалить все остальные точки.
источник
Вот код @Vanuan на C ++:
источник
std::vector<cv::Vec4i> lines;
объявлен в моем проекте в глобальной области видимости.Преобразовать в лабораторное пространство
Использовать кластер сегмента 2 kmeans
источник