Как компенсировать неравномерное освещение на фотографии распечатанной страницы?

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

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

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

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

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

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

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

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


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


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


person Norman Ramsey    schedule 28.11.2009    source источник


Ответы (10)


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

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

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

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

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

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

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

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

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

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

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

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

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

person Harry Spier    schedule 10.11.2011
comment
Гарри, похоже, отличная установка. Хотел бы я иметь такую ​​роскошь. К сожалению, я ищу программное решение проблемы неравномерного освещения. Если бы мне нужно было создать тысячи изображений, у меня были бы ресурсы, чтобы настроить отличное освещение, как это сделали вы. Но пытаюсь решить другую проблему. - person Norman Ramsey; 12.11.2011

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

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

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

EVEN = DOC * (MAX/REF)

Примечания:

  • остерегайтесь скобок: большая часть библиотек обработки изображений использует тип пикселя изображения для вычисления значений пикселей, и простое умножение приведет к перегрузке вашего пикселя. в конце концов, напишите цикл самостоятельно и используйте 32-битное целое число для промежуточных вычислений.
  • белое эталонное изображение можно сгладить перед использованием в процессе. любой фильтр сглаживания или размытия подойдет, и не бойтесь применять его агрессивно.
  • значение MAX в приведенной выше формуле представляет значение целевого пикселя в результирующем изображении. использование максимального значения пикселя нацелено на ярко-белый цвет, но вы можете настроить это значение на более светлый серый цвет.
person Adrien Plisson    schedule 28.11.2009
comment
Извините, но весь смысл моего проекта состоит в том, чтобы иметь возможность восстанавливать текст из дрянных изображений, сделанных в неконтролируемых условиях. Если это можно сделать на iPhone (tinyurl.com/clldjk), тогда должна быть возможность что-то закодировать. из изображения более высокого качества. - person Norman Ramsey; 29.11.2009
comment
поэтому я сделал некоторые предположения в первом абзаце. действительно, этот метод вообще не работает в неконтролируемых условиях. - person Adrien Plisson; 29.11.2009

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

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

person Arkenian    schedule 28.11.2009
comment
Спасибо за предложение; Я говорю о белом с темным текстом (иногда также красный рукописный текст, но это мелочь!). По краям часто бывает мусор, но пока темно, это не проблема: tinyurl.com/yh3pczg ( URL-адрес должен быть действителен примерно с октября по декабрь в большинстве лет). - person Norman Ramsey; 28.11.2009
comment
Уловка решения проблемы белого и черного заключается в том, чтобы найти края и определить градиент на них. Насколько это будет просто, во многом зависит от качества печати оригинала. Лазер на качественной бумаге, это у вас должно получиться довольно легко. Если освещение не такое уж плохое, чтобы найти край, начните с поиска чего-то более черного, чем 50% пикселей, а затем найдите что-то более белое, чем 50%. Вы также можете рассмотреть проекцию гистограммы, хотя, если у вас есть черный / белый, мы надеемся, что гистограмма будет иметь вид двух горбов. - person Arkenian; 28.11.2009
comment
Аркениан, я надеюсь, что смогу развить твою идею на следующей неделе. Тем временем я разместил несколько гистограмм с крошечными миниатюрами. (Полные изображения содержат текст, защищенный авторским правом, поэтому я не хочу их публиковать.) - person Norman Ramsey; 29.11.2009
comment
Глядя на имеющиеся у вас гистограммы, вы действительно хотите перейти к гораздо более низкому проценту. Я свободно признаю, что в основном я предлагаю очень дешевое обнаружение края, устанавливая произвольный порог для того, что составляет черный цвет, а затем используя то, что вы обнаружите при этом, для уточнения ваших пороговых значений. Но в целом, если вы возьмете раздел, который, как вы знаете, является черным, и посмотрите, как меняются значения пикселей при переходе к разделу, который, как вы знаете, является белым, установка порога для этой области обычно довольно проста в ситуациях OCR. вы имеете дело с. Если у вас не будет плохой ксерокопии из старых времен - person Arkenian; 29.11.2009

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

person Simon Righarts    schedule 28.11.2009
comment
+1 хотя я думаю, что средние оттенки серого не будут работать ни по одному из краев - много мусора по краям. - person Norman Ramsey; 28.11.2009

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

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

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

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

person midtiby    schedule 28.11.2009
comment
Думаю, если бы я мог идентифицировать и удалить маленькие черные объекты и просто получить фон, моя проблема была бы решена. Ваш пример с математическими работами интересен, но когда я перехожу к разделу «Морфологические операции», я мог бы также сказать «черная магия». +1 за книгу. - person Norman Ramsey; 29.11.2009
comment
Морфологический анализ изображений - это некий король магии ;-) Все морфологические операции основаны на элементе структурирования (SE), который представляет собой группу соседних пикселей (может быть блок размером 3x3 пикселя). Чтобы определить значения пикселей нового изображения, элемент структурирования накладывается на позицию каждого пикселя, и результирующее значение пикселя является максимальным значением пикселя исходного изображения внутри элемента структурирования. Эта операция является расширением, если максимум заменяется минимумом, появляется операция, известная как эрозия. Морфологическое закрытие - это сочетание сначала дилатации и эрозии. - person midtiby; 30.11.2009

На ум приходят два алгоритма:

  • Фильтр высоких частот для смягчения низкочастотного градиента освещения
  • Местный порог с подходящим радиусом
person Cecil Has a Name    schedule 21.12.2009
comment
Примеры на local.wasp.uwa.edu.au/~pbourke/ miscellaneous / imagefilter предполагают, что фильтр высоких частот сохранит края, но устранит различие между черным и белым. Другие страницы, посвященные высокочастотной фильтрации, также предполагают, что это способ выделить края и детали. Может быть, отсечка просто неправильная - идея звучит многообещающе - но пока я не найду БПФ на полке, я не собираюсь с ним связываться. - person Norman Ramsey; 22.12.2009
comment
Ах ах. Для создания эффекта высоких частот не требуется БПФ, вы можете добиться высоких частот в GIMP и любой другой программе обработки изображений, которая поддерживает слои (или сделайте это самостоятельно), вычислив разницу между исходным изображением и размытой версией изображения. . В GIMP продублируйте слой. Размыть и инвертировать верхний слой и установить прозрачность на 50%. Помните: исходный сигнал - результат сигнала lowpass = сигнал highpass. Размытие можно вычислить с использованием алгоритмов Гаусса, Баттерворта, бокса или медианы. - person Cecil Has a Name; 26.12.2009

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

Параметр ImageMagick -lat может это сделать, например:

convert -lat 50x50-2000 input.jpg output.jpg

Пример ввода input.jpg

Пример вывода output.jpg

person feklee    schedule 29.08.2016

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

person comingstorm    schedule 28.11.2009
comment
На самом деле отличить задний план от переднего действительно сложно. Я надеюсь, что смогу перепрофилировать djvu. Мне слишком сложно уследить за остальным вашим ответом. - person Norman Ramsey; 29.11.2009

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

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

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

person Ed_S    schedule 21.12.2009
comment
Этот метод выглядит многообещающим, за исключением самого низкого значения белого в углах. Я думаю, что это проблема, которую я пытаюсь решить :-) - person Norman Ramsey; 22.12.2009
comment
Наименьшее значение белого может быть меньше наивысшего значения черного, и этот метод по-прежнему будет работать. Возможно, вам сначала потребуется выполнить глобальную коррекцию изображения. Это сделает самое яркое значение 255 и самое темное значение 0. Соответственно масштабируйте промежуточные значения. Затем установите первый порог на 255. Установите второй порог на 1 или даже на 0. Вы действительно зависите от подключенной белой части и постепенного изменения освещения. Если это так, то размер шага при переходе от текста к бумаге будет больше, чем изменяется освещение. Так что текст можно игнорировать. - person Ed_S; 05.01.2010
comment
Если бы вы могли прислать мне изображения, у меня есть этот алгоритм. Я могу обработать изображения и отправить вам результаты. - person Ed_S; 07.01.2010

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

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

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

person andrew    schedule 02.03.2010