Обнаружение пустых страниц в отсканированных документах - PullRequest
19 голосов
/ 09 марта 2011

Итак, нам нужно определить, представляет ли изображение, созданное сканером, пустую страницу.Когда дело доходит до обработки изображений, я далеко ухожу, так что я должен этим заниматься сообществом.

Вот что я придумал:

  • Пустые страницы могут быть ярко белой, серой переработанной бумаги или пожелтевшей старой бумаги.В настоящее время идея заключается в создании гистограммы для страницы, поиске крутого увеличения кривой и получении процента пикселей темнее, чем этот.Если это превышает пороговое значение, страница, скорее всего, не пуста.

  • Поскольку это, скорее всего, классифицирует страницу, содержащую одну строку текста вверху, как пустую, мы бы разбили страницу на страницы и собирали статистику по каждой плитке.

  • Нам нужно будет отсканировать отсканированные степлеры и отверстия от переплета (вероятно, только в определенных тайлах), но это можно отложить на более позднюю стадию.Однако, если у вас есть идея, на что обратить внимание, кроме этих двух, пожалуйста, укажите это в комментарии.

  • Это должно быть быстро.Это часть рабочего процесса обработки документов, который обрабатывает (десятки) тысяч страниц в день.Если обработка страницы занимает десять секунд дольше, наши клиенты должны будут сказать своим клиентам, что им придется ждать своих результатов на несколько дней дольше.(Если это приводит к большему количеству ложных срабатываний, некоторые клиенты предпочитают, чтобы кто-то проверил несколько десятков найденных «пустых» страниц, чем заставил бы их клиента ждать еще один день.)

Так вот мойвопросы:

  1. Это хорошая идея, чтобы пойти по этому пути или есть что-то лучше?

  2. Если бы мы сделали это таким образом, как бы я это сделал?Какой хороший (дешевый) алгоритм для определения порога для страницы?Можем ли мы получить значительную скорость, предполагая, что аналогичный порог для пакета документов?До какой точности значения яркости могут быть округлены до регистрации?Какие причуды мы могли ожидать?

Ответы [ 8 ]

2 голосов
/ 14 марта 2011

My fall class выполняет кучу проектов по обработке изображений.Вот что я бы попробовал:

  1. Проецирование от цвета к оттенкам серого
  2. Вылейте все пиксели в простую гистограмму, скажем, 100 сегментов между 0 и 1
  3. Найдителокальный минимум на гистограмме такой, что абсолютное значение above - below настолько мало, насколько это возможно, где above - это число более ярких пикселей, а below - количество более темных пикселей
  4. . Force above пикселей на белый и below пикселей на черный
  5. Если хотите, в качестве дополнительного шага вы можете удалить черные края
  6. Если черных пикселей почти нет, страница пуста

Первые два шага должны быть объединены, и они являются единственными длительными шагами;на изображениях с разрешением 600 точек на дюйм вам, возможно, придется коснуться многих миллионов пикселей.Остальное будет молниеносно.Я был бы очень удивлен, если бы вы не могли классифицировать несколько изображений в секунду, особенно если вы знаете, что не будет черных граней.

Единственная часть, которая требует обучения или эксперимента, - это последний шаг.Также возможно, что вам нужно будет поиграть с количеством сегментов в гистограмме;если слишком много ведер, у вас может быть плохой локальный минимум.

Удачи, и сообщите нам, как вы разбираетесь!

2 голосов
/ 11 марта 2011

Когда я работал на процессоре документов (~ 8 лет назад), мы работали с клиентскими проектами, начиная от очень «чистых» страниц размером только с буквы США до обложки / картона неправильной формы, смешанной с обычными страницами. Операторы загружали предварительно отсортированные файлы в сканирующие машины и должны были только следить за сложенными углами и аналогичными механическими проблемами. Их вывод был несколькими потоками сотен изображений, соответствующих диапазону файлов. Один оператор сканера может легко сканировать 15 тыс. Листов бумаги в смену (это всего 0,60 страниц / сек, в то время как сканер на скорости может обрабатывать 3 страницы / сек и сканировать обе стороны). Более поздние операторы обрабатывали те, кто ищет ключевые страницы, чтобы отметить начало и конец файла. (Иногда здесь можно использовать распознавание изображений, но люди также проводят проверку качества первых операторов.) У нас было много переменных, которые можно было установить для каждого клиентского проекта.

Я основываю приблизительный план ниже на этом опыте и на том, как кажется, что ваши цели и рабочий процесс схожи.

(Терминология: под клиентом я подразумеваю нашего клиента, например, конкретный банк. Проект или клиентский проект - это набор документов от этого клиента, который содержит много файлов, например, все закладные, обработанные определенной ветвью в данном году. A файл - это логическая схема, которая обычно представляет собой физическую папку для одного из клиентов клиента, например, все ипотечные бумаги для одного адреса.)

  1. Отрежьте верх, низ, боковые стороны и углы. Выбросьте их из своих расчетов (даже если вы, вероятно, сохраните их в конечном изображении). Это покроет отверстия для скоб, отверстия для переплета, а также (крошечные) загнутые углы и очень мелкие рваные края, которые выглядят как черные пятна. В зависимости от того, как вы сканируете, последние два могут быть меньшей проблемой.

    При необходимости изменяйте размеры этих срезов для каждого клиентского проекта. Например, даже очень тонкий срез, скажем, 1-2 мм, устранит большинство неровных краев без увеличения частоты ложных срабатываний.

  2. Преобразование в черно-белое изображение, 1 бит на пиксель. Я подозреваю, что вы уже делаете это для некоторых клиентских проектов, так что выполнение этого эффективно и действенно, что может быть тонким, не должно быть дополнительной работой. (Даже если вы не сохраните изображение размером 1 бит на пиксель в качестве результата доставки, преобразование будет полезно при обнаружении пустой страницы.) Устраните шум, отбрасывая любые черные пиксели без одного или только с одним черным соседом (используя все окружающие 8 в качестве соседей).

    После обрезания конечностей (# 1) и этого упрощенного шумоподавления на пустых страницах будет очень мало черных пикселей; большинство бланков вообще не имеют черных пикселей - исключая исключительно низкое качество страницы, рукописные штампы (при сканировании задних сторон, упомянутые ниже) или другие обстоятельства по всему проекту и т. д.

  3. В зависимости от клиентского проекта, вы можете установить горячие точки для просмотра - обратное отсечение сторон. Например, просмотр 1-дюймовой полосы, где должна отображаться одна строка в верхней части страницы, может уменьшить количество ложных срабатываний. Низкоконтрастное сканирование или блеклая печатная копия (возможно, даже карандаш, который может быть распространен на задних сторонах) только с одной линией таким образом, текст будет отличаться от пустой страницы.

    Какие разделы стоит посмотреть, зависит от каждого проекта, но не пытайтесь разделить страницу на плитки, а затем разделить эти плитки на области, представляющие интерес. Вместо этого распараллелите это на уровне страницы; например 1 рабочий на ядро, каждый рабочий обрабатывает полную страницу за раз.

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

    Например, если конкретный проект сканирует только одну сторону каждой страницы, то обнаружение двух пустых страниц подряд является хорошим признаком того, что пара страниц в файле была перевернута вверх ногами (клиенты часто передают такие файлы как:этот).Либо сортировщики (которые удаляют такие предметы, как скрепки и скрепки), либо первые операторы машины должны были поймать эту ошибку, но, независимо от этого, теперь для проверки потребуется ручная проверка.проекты, которые имели очень чистые файлы, чтобы сортировщики могли вставлять (обычно цветные) пустые страницы, отмечая границы файлов.В этом случае второй набор людей все еще выполнял набор по номеру файла, но ему нужно было только изучить первую страницу каждого файла.Это не было редкостью, но и не часто= потеря данных) и ложные отрицания (= раздражающие пробелы и иные безвредные, но максимально допустимая скорость все еще может быть указана в контракте по проекту).Это сильно варьируется в зависимости от проекта и типа файлов / документов, с которыми вы работаете, но оно поможет вам в обнаружении.Вы получите гораздо лучшие результаты от специализированного подхода, чем от одного универсального подхода, даже если эти подходы похожи на 80-98%.

    Если вы предоставляете клиенту изображения 1bpp дляНапример, вы можете даже не захотеть / не нужно устранять пробелы, поскольку размер файла (и, в конечном счете, размер поставляемого набора данных) не будет проблемой.Это может быть приемлемым компромиссом, когда устранение большинства пробелов затруднено при сохранении низкого уровня ложных срабатываний;например, для файлов с маркированными штампами («получено», «принято», «срок исполнения» и т. д .; они просочились назад) или другие проблемы, например.

2 голосов
/ 09 марта 2011

Выполнить какое-то простое обнаружение фронта . Если число пикселей, составляющих ребра, ниже некоторого порогового значения, то с большой вероятностью страница будет пустой. Это можно улучшить, классифицируя определенные ребра, которые с высокой степенью достоверности (по форме и расположению) соответствуют перфорированным отверстиям и скобам, как тривиальные и исключая их из метрики.

2 голосов
/ 09 марта 2011

Если вы знаете, что отсканированная страница будет заполнять изображение целиком, то вычисление стандартного отклонения может быть хорошим способом сделать это.

Я бы предложил немного размыть страницу, чтобы уменьшить шум. Затем вычислите SD для страницы, теоретически для страницы более или менее все цвета будут иметь низкое значение SD, а для страницы с большим количеством текста - более высокое значение SD. Тогда это «тренировка» системы для работы, когда страница проста, а когда - текст. Вы можете обнаружить, что некоторые страницы трудно сказать.

Вы могли бы обучить его, обработав огромное количество страниц, и оно проходит их все, и вы говорите, ясно это или нет.

EDIT

хорошо, белая страница с черным текстом, если у нас есть только страница и нет окружающих материалов, будет иметь средний цвет серого, вероятно, довольно светло-серый. Получение среднего - это цикл for для всех пикселей, добавление их значений и деление на количество пикселей. Я не очень хорошо разбираюсь в этих вещах, но достаточно сказать, что это не так долго. Если у вас нет огромных изображений.

SD - секунда для цикла, на этот раз мы подсчитываем, насколько каждый пиксель отличается от среднего, а затем делим на среднее. Это займет немного больше времени, чем среднее значение, так как мы должны сделать что-то вроде

diff = thispixel - mean;
if(diff < 0) {
    diff = -diff;
}
runningTotal += diff;

Для однотонной страницы каждый пиксель будет близок к среднему значению, поэтому наш SD будет низким. Если SD ниже определенного значения, мы можем предположить, что это означает, что все страницы одного цвета.

Это может иметь проблемы, если их текст очень минимален, так как он не окажет большого влияния на SD, поэтому, возможно, как вы предложили в вопросе, разбейте страницу на разделы. Я предлагаю полосы горизонтально, поскольку текст имеет тенденцию идти этим путем. Если мы делаем одну из этих полосок по одной, как только одна полоска предполагает, что у нее есть текст, мы можем остановиться, поскольку нам все равно, пусто ли остальное или нет.

Размытие страницы поможет уменьшить шум, так как нечетный пиксель шума будет уменьшен в своем воздействии, таким образом, вы получите «более жесткий» SD. Вы также можете использовать его, чтобы уменьшить разрешение вашего изображения.

Допустим, изображение соуса имеет ширину 300 на 900, вы можете сэмплировать пиксели в блоках по девять, 3 * 3 и, таким образом, получить изображение шириной 100 на 300, чтобы его можно было использовать для уменьшения количество вычислений, которое вам нужно сделать, в данном случае на девятое!

Основная проблема заключается в том, чтобы определить, насколько высоким может быть SD с простой страницей. Может быть, он найдет SD загрузки пустых страниц.

Судя по звукам, вы, вероятно, захотите занять золотую середину, которая позволит ему быть неуверенным и потребовать вмешательства человека, возможно, позволив человеческой ценности обучить систему совершенствоваться?

1 голос
/ 02 ноября 2012

Проверьте этот алгоритм обнаружения линии: http://homepages.inf.ed.ac.uk/rbf/HIPR2/linedet.htm. В дополнение к подробному объяснению того, как работает алгоритм, есть демо , где вы можете использовать свое собственное изображение и посмотреть результаты. Я попробовал два изображения: 1) черно-белое сканирование квитанции , 2) черно-белое, "чистая" оборотная сторона той же квитанции . Все алгоритмы обнаружения ребер, которые я пробовал, находили ребра на «пустой» странице. Но этот алгоритм обнаружения строк был единственным алгоритмом, который правильно находил строки на первой странице, но ничего не нашел на «пустой» задней странице.

0 голосов
/ 13 октября 2017

Вы можете сделать шумную обрезку , то есть размыть изображение и выполнить автоматическую обрезку (без фактической модификации изображения). Если ширина или высота результата обрезки ниже порогового значения (например, от 80 до 100 для изображения с разрешением 600 точек на дюйм), то страница пуста.

Подтверждение концепции с использованием интерфейса командной строки ImageMagick :

$ convert scan.png -shave 300x0 -virtual-pixel White -blur 0x15 -fuzz 15% \
    -trim info:

Приведенная выше команда предполагает черно-белое (1-битное) изображение формата DIN A4 с разрешением 600 точек на дюйм. Он также игнорирует поле в 300 пикселей, так что артефакты, такие как отверстия перфорации, не дают ложных негативов .

0 голосов
/ 10 марта 2011

Вы можете взять средний уровень серого (целое число) для каждых нескольких строк отсканированного изображения (в зависимости от разрешения и количества строк, необходимых для захвата одной строки текста), а затем рассмотреть разброс средних значений по строкам.Если на странице нет текста, разброс средств должен быть небольшим (т. Е. Фон варьируется от 250 до 255), а если текст присутствует на всей странице или на части страницы, разброс будет намного больше (т.е.От 15 для текста до 250 для фона).

Мне кажется, что решение должно быть вычислительно простым из-за большого количества проверяемых страниц.Подходы, требующие дальнейшей обработки (обнаружение контуров, фильтрация и т. Д.), Кажутся излишними и требуют намного больше времени для запуска.

Нет необходимости обрабатывать пиксель за пикселем, использование матриц поможет это сделать более эффективным,Например, используя Numpy, вы можете вычислить средние значения, суммы и т. д. для целых строк, столбцов или матриц одновременно гораздо более эффективно.Также нет необходимости обрабатывать КАЖДЫЙ пиксель, хороший образец строк должен быть в состоянии выполнить задачу с одинаковой точностью.Точность 8 бит должна быть хорошей, и вы даже можете выполнить повторную выборку в большие пиксели перед запуском этого алгоритма обработки.

0 голосов
/ 09 марта 2011

Похоже, что вы пытаетесь преобразовать все документы для компании в цифровые документы. Часть этой статьи может быть очень старой.

Скажите, что ваш текст черный, а любой другой цвет - фон. Если вы берете два взвешенных средних, одно из которых состоит из того, что вы считаете текстом, а другое из фона, вы можете сравнить эти два и посмотреть, достаточно ли они отдалены, чтобы рассмотреть возможность дальнейшей оценки. Это позволит устранить неравномерное старение бумаги.

Сшитые и перфорированные отверстия на бумаге довольно стандартного размера, но они будут отображаться серыми или не отображаться вообще, если вы сканируете на белом фоне. Если нет, то вы можете угадать, где они находятся, и удалить их.

Теперь мы рассмотрим области, представляющие большой интерес, области, где черные пиксели являются наиболее плотными. Выберите часть этого и OCR это. Поместите начальный верхний левый угол ближе к области, где начинается текст. В типичном документе сплошная пустая линейная область, идущая слева направо, а другая, идущая сверху вниз, обозначает верхнюю и левую стороны абзаца. Вы можете быть уверены, что получили строку текста, потому что под строкой текста находится еще одна пустая область слева направо. Так что вам не нужно беспокоиться о выборе части, которая будет разрезать текст пополам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...