Как реализовать эффект “сканера” в Linux для исправления документов с различной темнотой фона?

Вопрос или проблема

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

enter image description here

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

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

Итак, я бы хотел иметь способ сделать такой эффект на своем Linux-компьютере. Эффект, который сохраняет изображение (все линии темные), но делает фон белым. В идеале более настраиваемый, чем на том сайте. Где я могу это найти?

Я использую ImageMagick для этого. Это достаточно часто случается для меня1, что я написал простой скрипт под названием flatten_image:

#!/bin/bash

# Используйте ImageMagick для улучшения плохо освещенных, низкоконтрастных фотографий
# линейных рисунков и текста.
#
# Использование: flatten_image <входное изображение> <выходное изображение>

convert $1 \( +clone -blur 30x30 -negate \) -compose Plus -composite -normalize $2

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

Без какой-либо настройки, он делает следующее с вашим изображением. Он работает лучше всего, если вы обрежете любые высококонтрастные края на изображении.

flattened image


1 Должен сказать “случалось”. Я был модератором на EE.SE, и люди постоянно загружали плохо освещенные изображения своих рукописных диаграмм, и я создал этот скрипт, чтобы быстро их исправлять.

В таких случаях с помощью GIMP и немного ручного труда:

  • выберите самое яркое белое пятно, примените уровни и установите белую точку на это
    white spot in the top left
  • после этого переключитесь в режим быстрой маски и сделайте градиент от белого к черному от самого яркого белого пятна до самого темного белого пятна, затем отключите быструю маску
  • теперь выберите самое темное белое пятно, примените уровни и установите белую точку
    white spot in the bottom right

Мой подход – сначала приблизить чистый фон, затем использовать его для получения равномерной яркости

Steps of process

  1. Скопировать слой
  2. Применить фильтр Гаусса с малым радиусом (~1)
  3. Применить фильтр расширения, достаточный, чтобы скрыть все чернила на странице
  4. Используйте режим наложения “Вычитание” или “Деление”, у меня нет GIMP под рукой, поэтому используйте тот, который кажется вам правильным
  5. Теперь, когда изображение имеет равномерную яркость, объедините слои и используйте уровни или кривые, как обычно

При наличии разумных настроек вы можете автоматизировать этот процесс в GIMP или другими способами (ImageMagick, Python)

Это очень распространенная задача в компьютерном зрении: ключевое слово пороговая обработка.

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

adaptive thresholding

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

В приведенном ниже примере я использовал бесплатный IrfanView, небольшое приложение для Windows, которое хорошо работает под wine в Linux, но мощный, бесплатный GIMP, который вы установили, также может выполнить эту задачу. GIMP, будучи таким мощным, также является сложным и имеет более длительную кривую обучения.

Edited score

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

  • Откройте файл в редакторе изображений.
  • Откройте диалоговые окна для настройки следующих параметров и редактируйте при необходимости. [В IrfanView нажмите ShiftG.]
    • Контраст
    • Гамма
    • Яркость
  • Вероятно, изображение будет печататься лучше, если его сделать монохромным (т.е. в градациях серого) и уменьшить количество цветов (оттенков серого). [В IrfanView нажмите CtrlG, чтобы сделать градации серого, и пункт меню Изображение | Уменьшить глубину цвета для этого диалога.]

Другие способы улучшения изображения включают использование инструментов для поворота и выравнивания изображения, например, расширения Перспективные преобразования .8bf для Adobe и IrfanView.

Вы также можете сделать это в Imagemagick с нормализацией деления.

[![magick music.webp \( +clone -blur 0x13 \) +swap -compose divide -composite music.png][1]][1]

enter image description here

Ответ или решение

Конечно, обработка фотографий документов, сделанных в условиях неоднородного освещения, является непростой задачей. Зачастую результатом таких съемок становятся изображения, где фон имеет неравномерную яркость, что затрудняет последующую печать документов. Для решения этой проблемы в среде Linux существует несколько методов, основанных на различных инструментах обработки изображений, включая ImageMagick, GIMP, и OpenCV.

Теория (Theory):

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

Пример (Example):

  1. ImageMagick:

    Использование ImageMagick через скрипты bash позволяет автоматизировать процесс обработки изображений. Пример простого скрипта на bash:

    #!/bin/bash
    
    # Улучшение освещенности и контрастности изображений
    # Использование: ./script.sh <input_image> <output_image>
    
    convert $1 \( +clone -blur 30x30 -negate \) -compose Plus -composite -normalize $2

    В этом скрипте используется высокочастотный фильтр для выделения деталей и нормализация для выравнивания контрастности.

  2. GIMP:

    В GIMP процесс выравнивания яркости может быть выполнен вручную с использованием слоёв и уровней:

    • Скопируйте слой изображения.
    • Примените небольшой фильтр Gaussian Blur.
    • Используйте фильтр Dilate для удаления чернил.
    • Примените режим наложения (Subtract или Divide), чтобы получить равномерную яркость.
    • После этого используйте кривые или уровни для достижения желаемого результата.
  3. OpenCV:

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

    import cv2
    
    # Загрузка изображения и преобразование в серый цвет
    image = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)
    adaptive_thresh = cv2.adaptiveThreshold(
       image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
       cv2.THRESH_BINARY, 11, 2
    )
    cv2.imwrite('output.jpg', adaptive_thresh)

Применение (Application):

На практике, выбор инструмента и методики зависит от конкретной задачи и предпочтений пользователя. Для автоматизации или пакетной обработки фотографий документов ImageMagick подойдет благодаря своей возможности работы через командную строку и написания скриптов. Для тех пользователей, кто предпочитает графические интерфейсы и более гибкое управление процессом, GIMP станет отличным выбором из-за своей мощной функциональности и поддержания множества плагинов. OpenCV, будучи библиотекой для Python, предоставляет гибкие возможности для интеграции в сложные автоматизированные системы обработки изображений.

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

Оцените материал
Добавить комментарий

Капча загружается...