Как компенсировать неравномерность освещения на фотографии распечатанной страницы? - PullRequest
4 голосов
/ 28 ноября 2009

Я пытаюсь научить свою камеру быть сканером: я делаю снимки напечатанного текста, а затем преобразую их в растровые изображения (а затем в djvu и OCR). Мне нужно вычислить порог, для которого пиксели должны быть белыми, а какие черными, но я застрял из-за неравномерного освещения. Например, если пиксели в центре достаточно темные, я могу получить черные пиксели по углам.

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

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

  • Предположим, что все белые части бумаги имеют одинаковую отражательную способность / альбедо / что угодно.

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

  • По отражающей способности пикселя классифицировать его как белый или черный

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

Все полезные советы будут проголосованы!


РЕДАКТИРОВАТЬ : Я определенно подумал о том, чтобы нарезать изображение на достаточно большие куски, чтобы они по-прежнему выглядели как «текст на белом фоне», но достаточно малы, чтобы освещение одной части было менее равномерно Я думаю, что если я затем интерполирую пороги, чтобы не было разрыва между границами подизображения, я, вероятно, получу что-то наполовину приличное. Это хорошее предложение, и мне придется попробовать его, но оно все еще оставляет мне проблему с тем, где провести черту между белым и черным. Еще мысли?


EDIT : Вот некоторые снимки экрана из GIMP, показывающие различные гистограммы и «лучшее» пороговое значение (выбранное вручную) для каждой гистограммы. В двух из трех достаточно одного порога для всего изображения. В третьем, однако, верхний левый угол действительно нуждается в другом пороге:

image image image

Ответы [ 10 ]

5 голосов
/ 10 ноября 2011

Я не уверен, что вам все еще нужно решение по прошествии этого времени, но если вы все еще нуждаетесь. Несколько лет назад я и моя команда сфотографировали около 250 000 страниц с помощью камеры и преобразовали их в (почти черно-белые) полутоновые изображения, которые мы затем DjVued (также сделать PDF-файлы).

(См. Каталог и полная коллекция фотографических факсимиле из 1144 бумажных стенограмм Французского института Пондишери .)

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

  1. Настройка камеры и освещения

    а) Мы приклеили пустую рамку к верхней части таблицы, чтобы наши страницы находились в том же положении.

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

  2. Обработка изображений

    Мы использовали бесплатный пакет программного обеспечения irfanview .

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

  3. Создание изображений DjVu.

    Мы использовали бесплатное DjVu Solo 3.1 для создания изображений DjVu. Это имеет несколько режимов для создания изображений DjVu. Режим, который создает черно-белые изображения, не работал для нас хорошо для фотографий, но режим «фото» работал.

    Мы не использовали OCR (так как изображения были написаны от руки на санскрите), но до тех пор, пока буквы равномерно освещены, я думаю, что ваше программное обеспечение OCR должно игнорировать большие черные области, как между двумя страницами. Но вы всегда можете избавиться от черного между двухстраничным разворотом или по краям, обрезая страницы дважды для левой страницы и один раз для правой страницы, и программное обеспечение irfanview позволит вам умно нумеровать ваши страницы, чтобы вы могли Затем можно повторно заполнить страницы в правильном порядке. Т.е. переименуйте ваши страницы в что-то вроде page-xxxA для левых страниц и page-xxxB для правых страниц, и страницы будут правильно отсортированы по имени.

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

2 голосов
/ 28 ноября 2009

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

сфотографируйте белый лист бумаги, который покрывает всю рабочую область вашего "сканера". сохранить эту картинку, она говорит, что такое белая бумага для каждого пикселя. теперь, когда вы делаете снимок документа для сканирования, вы можете перезагрузить свое «белое эталонное изображение» и даже освещение перед выполнением порогового значения.

давайте назовем эталонный белый REF, DOC-изображение, четное изображение с подсветкой EVEN и максимальное значение пикселя MAX (для 8-битной визуализации это 255). за каждый пиксель:

EVEN = DOC * (MAX/REF)

Примечания:

  • Остерегайтесь скобок: большинство библиотек обработки изображений использует тип пикселя изображения для выполнения вычисления значений пикселя, и простое умножение перегрузит ваш пиксель. в конце концов, напишите цикл самостоятельно и используйте 32-разрядное целое число для промежуточных вычислений.
  • белое эталонное изображение может быть сглажено перед использованием в процессе. подойдет любой фильтр сглаживания или размытия, и не стесняйтесь применять его агрессивно.
  • значение MAX в формуле выше представляет значение целевого пикселя в результирующем изображении. использование максимального значения в пикселях позволяет получить ярко-белый цвет, но вы можете отрегулировать это значение для более светлого серого.
1 голос
/ 21 декабря 2009

Мне приходят в голову два алгоритма:

  • Высокочастотный для ослабления низкочастотного градиента освещения
  • Локальный порог с соответствующим радиусом
1 голос
/ 28 ноября 2009

Я предполагаю, что вы делаете снимки (относительно) маленьких черных букв на белом фоне.

Одним из подходов может быть «удаление» маленьких черных объектов, сохраняя при этом изменения освещенности фона. Это дает оценку освещенности изображения, которое можно использовать для нормализации исходного изображения. Часто достаточно вычесть оценку освещенности из исходного изображения, а затем выполнить пороговую сегментацию. Этот подход основан на морфологических фильтрах серой шкалы и может быть реализован в matlab, как показано ниже:

img = imread('filename.png');
illumination = imclose(img, strel('disk', 10)); 
imgCorrected = img - illumination; 
thresholdValue = graythresh(imgCorrected); 
bw = imgCorrected > thresholdValue;

Для примера с реальными изображениями посмотрите это руководство из mathworks . Для дальнейшего изучения использования морфологического анализа изображений можно рекомендовать эту книгу Пьера Сойля.

1 голос
/ 28 ноября 2009

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

1 голос
/ 28 ноября 2009

Хорошо. Обычно обработка изображений, которую я выполняю, очень чувствительна ко времени, поэтому сложный алгоритм, подобный тому, который вы ищете, не сработает. Но . , , Рассматривали ли вы разделение изображения на более мелкие части и масштабирование каждого подизображения? Это должно заставить темные пиксели выделяться довольно хорошо даже на изображении с переменным освещением (здесь я предполагаю, что вы говорите о стандартной в основном белой странице с темным текстом).

Это обман, но намного проще, чем "правильный" способ, который вы предлагаете.

0 голосов
/ 29 августа 2016

Адаптивное пороговое значение - ключевое слово. Цитата из статьи 2003 Р. Фишер, С. Перкинс, А. Уокер и Э. Вольфарт: «Это более сложная версия порогового значения может приспосабливаться к изменяющимся условиям освещения на изображении, например которые происходят в результате сильного градиента освещения или теней. "

0 голосов
/ 02 марта 2010

Почему вы не используете простые операции открытия и закрытия? Попробуйте это, просто посмотрите на результаты: SRC - изображение Курс

src - открыто (src) закрыть (src) - src

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

0 голосов
/ 21 декабря 2009

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

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

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

0 голосов
/ 28 ноября 2009

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

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