Как исправить неравномерное/градиентное освещение на холсте с белым фоном?

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

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

Ниже приведен пример изображения; оригинал имеет ширину около 3 см.

Как это можно отредактировать, чтобы фон был равномерно белым?

Исходное изображение с неравномерным освещением

-Редактировать-

Отсканированные результаты ниже, неисправленные и исправленные. Хотя на первый взгляд это выглядит довольно многообещающе, к сожалению, это полное разрешение , которое вы видите здесь (ширина 600 пикселей); сканер может делать 300 точек на дюйм, а рисунок имеет ширину примерно один дюйм. Это немного меньше по сравнению с 5000 px от камеры.

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

Сканировать без исправления Скан с исправленной кривой

Есть ли причина, по которой вы фотографируете его, а не сканируете?
Да; холст может быть больше А4. Но вечером сравню результаты. Я немного подозрительно отношусь к отражению, которое может возникнуть на графите.
@ColeJohnson Сканирование добавлено выше.
Попробуйте еще кое-что: возьмите стол с подсветкой или просто повесьте свой рисунок и посветите на него ярким светом с обратной стороны, а затем сфотографируйте его с проходящим через него светом (позволив самой бумаге действовать как рассеиватель). Конечно, это не сработает с непрозрачными красками или если на обратной стороне что-то нарисовано, но для односторонних рисунков карандашом, мелком, тушью или акварелью, возможно, стоит попробовать.

Ответы (4)

Метод, который я использовал сам, похож на ваш , но использует плагин Resynthesizer (для GIMP) или Content-Aware Fill (для Photoshop) для восстановления градиента:

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

    • Начните с использования фильтра обнаружения краев, такого как Difference of Gaussians , на (копии) вашего скана, чтобы грубо извлечь рисунок:

      Шаг 1.1: Извлечение чертежа с разностью гауссианов

    • Если результату не хватает контраста, используйте инструмент « Уровни » , чтобы затемнить его:

      Шаг 1.2: Настройте уровни

    • Примените размытие по Гауссу :

      Шаг 1.3: Примените размытие по Гауссу

    • Используйте инструмент « Порог » , чтобы получить маску, покрывающую весь рисунок, и используйте «Выбор по цвету», чтобы выбрать его:

      Шаг 1.4: Используйте пороговый инструмент для получения маски

  2. Когда у вас есть выделение, покрывающее рисунок, сделайте копию исходного отсканированного слоя и используйте « Исправить выделение» / « Заливка с учетом содержимого», чтобы заполнить его. В идеале ваш скопированный слой теперь должен выглядеть как изображение чистого листа бумаги:

    Шаг 2. Исцелите выделение, чтобы восстановить чистый лист бумаги.

  3. Установите режим редактируемого слоя на «Разделить», как в вашем собственном ответе. Если вы хотите сохранить часть текстуры бумаги и/или тени, вы можете немного уменьшить непрозрачность слоя и, возможно, применить небольшое размытие:

    Шаг 3: Разделите по слою пустой бумаги

    (На картинке выше заполненный слой Gaussian размыт на 10 пикселей, а непрозрачность установлена ​​на 95%.)

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

    Шаг 4: Настройте уровни

(Ps. Щелкните изображения половинного размера, чтобы просмотреть их в полном размере.)

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

Это очень круто и собственно то, что я хотел сделать в первую очередь, но не нашел Ресинтезатора! Завтра попробую с рисунками. Интересен тот, где покрыты большие части рисунка. Ваш результат уже выглядит великолепно.
Кажется, я не могу зарегистрировать Heal Selection в Gimp, к сожалению…
Это странно. Вы на Windows или Linux? Одна из возможностей заключается в том, что у вас может быть недоступен Python или GIMP по какой-то причине не может его найти. В этом случае Heal Selection может не работать, но базовый Filter> Map> Resynthesize (который может делать все, что может Heal Selection, даже если пользовательский интерфейс может быть не таким удобным) все еще должен быть доступен.
Я работаю в Linux и должен был сам скомпилировать плагин. Карта > Ресинтез действительно доступна. Как я могу проверить, находит ли Gimp нужную версию Python? У меня установлены 2.7.5 и 3.3.2.
Я не совсем уверен; Я сам использую Ubuntu и просто позволяю APT позаботиться обо всем. У вас вообще появляется подменю Python-Fu ? Если нет, вам может потребоваться установить GIMP-Python (если он доступен отдельно от самого GIMP) и/или перекомпилировать GIMP с включенной поддержкой Python. Опять же, я действительно просто догадываюсь здесь.
Поддержка Python, кажется, доступна. Задал вопрос по стеку сейчас.
Получил это работает сейчас! Результаты хорошие, но у меня были проблемы с некоторыми рисунками, содержащими однородные области без краев. Мскирование вручную было быстрее и надежнее; в конце концов, вы не можете покрыть слишком много, только слишком мало. А учитывая, что команда Heal занимает 11 минут на 4 ядрах (изображение 16 МП), полминуты маскирования вручную, я думаю, вполне достаточно :) — может, можно разделить вопрос на два про линейный градиент и нелинейный фон?
@Simon: Один из трюков, который вы можете использовать для ускорения инструмента «исцелить выбор», - это уменьшить масштаб сканирования, затем выполнить маскирование и лечение, а затем вернуться к исходному размеру. Во всяком случае, вам не нужно повторно синтезировать все детали бумажного зерна, особенно если вы просто собираетесь его размыть.
Мог бы и сам подумать об этом. Написал еще один скрипт. Таким образом, это делается за 30 секунд. Очень круто.

Редактировать: я написал скрипт Gimp , который выполняет следующие шаги, и еще один для Ilmaris answer . Оба скрипта доступны для скачивания на GitHub . Предлагаемый путь - этот .


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

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

    В Gimp: выберите rпрямоугольник сверху вниз, содержащий фон, вставьте Shift+Ctrl+Vв новое изображение и увеличьте Filter > Map > Tileего до размера изображения, запустите над ним размытие по Гауссу, затем скопируйте его обратно на изображение в качестве нового слоя.

  2. Установите режим слоя на Division .

  3. Уменьшите непрозрачность слоя по желанию, например, до 90 %. Сохранение его на 100% обычно слишком яркое.

Ступени деления

По сути, это означает, что фоновый слой определяет значение RGB w«белого» для каждого пикселя. Затем режим разделения слоя растягивает значение изображения от [0,w]до [0,255](см. Режимы слоя GIMP ) на пиксель.

(Плохо) Пример использования кривых и линейного градиента

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

Попытка с линейным градиентом

(Лучше) Пример с делением

Разделение дает гораздо лучшие результаты; освещение зафиксировано равномерно, а выгоревших участков, особенно в левой части рисунка, нет.

Использование деления

Или просто измените настройку уровней в фотошопе.
Для еще лучших результатов, особенно в случае непостоянных/нелинейных теней в обоих направлениях, можно сфотографировать белый лист бумаги, применить небольшое размытие, чтобы избавиться от шума камеры, и использовать что в качестве основы корректирующего слоя.
@SaturnsEye Попробуйте это с входным изображением выше. Не работает ;) Если бы бумага была ровной серой, например 10%, то да, это был бы самый простой способ.
@PlasmaHH Это потребует от меня использования штатива, чтобы получить постоянное расстояние, но это хорошее решение, особенно для сильно нарисованных фотографий. Обратная сторона бумаги в любом случае обычно белая, поэтому ее можно использовать для корректирующего слоя. (Мы используем разные виды бумаги с разными оттенками серого/коричневого).
@SimonA.Eugster: Если бы мне приходилось делать это чаще, чем время от времени, я бы в любом случае использовал штатив и воссоздаваемую настройку освещения для получения стабильных результатов.
Ах, вы правы, я почти получил это, используя только уровни, но это просто не так. Вы выиграли этот раунд, сэр! :)
Используя Afinity Photo, я использовал режим наложения «difference», и мне пришлось инвертировать результат. Я также наложил уровни поверх этого, чтобы затемнить темные участки.

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

Этот скрипт Gimp автоматизирует шаги 3 и 4 (обратите внимание, что требуется Resynthesizer), поэтому рабочий процесс просто: создать выделение, запустить скрипт. Сценарию требуется 6 секунд, чтобы создать 15-мегапиксельное изображение на моем 3-летнем ноутбуке.

введите описание изображения здесь

Шаг 1 (необязательно): Настройте кривые для получения глубокого черного цвета.

Черная точка

Шаг 2: Выберите объект

В Gimp Quick Mask Shift+Q— это быстрый способ. Используйте карандаш Nи покрасьте объект в белый цвет, нажмите Shift+Qеще раз, чтобы преобразовать маску в выделение.

Объект выбран

Шаг 3: Воссоздайте фон

  • Дублируйте изображение и масштабируйте до 400×400 пикселей.
  • Используйте « Исправить выделение » или « Заливка с учетом содержимого », чтобы исправить объект (остается только фон).
  • Используйте размытие по Гауссу, 40×40 пикселей
  • Уменьшите изображение до исходного размера и скопируйте его обратно как слой в исходное изображение.

Фон

Шаг 4: Режим деления

Установите режим слоя на Разделение и немного уменьшите непрозрачность, если хотите.

Фиксированное изображение

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

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

Вы можете поставить штатив лицом вниз и положить рисунок на пол.

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

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

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