У меня есть несколько старых отсканированных документов, и я хочу преобразовать их в черно-белые. Контент всегда должен быть черным, а фон белым:
Я использую Фотошоп.
Если у вас есть контроль над сканированием или вы можете отсканировать их повторно, увеличьте настройку контрастности при сканировании и установите черную точку в самом темном фрагменте текста, который вы можете найти. Это облегчило бы приведенные ниже шаги. Если нет, читайте дальше...
Вот часть довольно типичного скана старого документа:
Детали будут различаться в зависимости от документа (например, он несколько более контрастен, чем ваш образец), но общий контур будет одинаковым.
Обратите внимание, что ползунок желтого цвета сдвинут далеко вправо, осветляя желтоватый фон. Мне удалось лишь немного затемнить текст.
Это поможет вам пройти 95% пути. Отсканированный документ обычно имеет гистограмму с большим выступом вправо (бумага) и меньшим выступом влево (текст). Вам придется поэкспериментировать с документами, чтобы найти правильные настройки.
С этого момента вы можете дублировать изображение, сгладить дубликат и использовать обычные инструменты ретуширования Photoshop, чтобы очистить оставшуюся часть.
Вы упоминаете Photoshop, но если вам интересно, есть также плагин GIMP , который выполняет расширенную очистку и обработку оттенков серого:
Он называется Nuvola Tools и в основном ориентирован на отсканированные изображения, но вы можете попробовать.
До:
После:
Источник: Реестр плагинов GIMP .
С ГИМП:
Я пробовал различные упомянутые методы, в т.ч. бесплатный плагин FineThreshold http://www.mehdiplugins.com/english/finethreshold.htm . Этот плагин быстро дает хорошие результаты при условии, что документ имеет однородное освещение и сама бумага также однородного качества. Однако это был не мой случай. Я заметил, что верхняя сторона каждого документа была более светлой, чем нижняя. Следовательно, каждый метод и его частичная настройка работали хорошо только для части каждой страницы, а не для остальной ее части.
В конце концов я нашел эффект «Динамическое пороговое значение» , который является частью Zoner Photo Studio v15 . Я думаю, его eval версия бесплатна в течение некоторого периода времени. Кажется, что порог ч/б смещается в соответствии с яркостью соседства. Его применение является одноэтапным процессом. Для меня параметры «Большой, значение +14» сработали очень хорошо. Помимо «Редактора» Zoner содержит также интерфейс «Менеджер», в котором вы можете обрабатывать пакет по всем выбранным изображениям. В конце концов я смог распечатать результат на очень старом лазерном принтере с разрешением 300 dpi и отличным контрастом.
Теперь единственной оставшейся задачей, которую я ищу, является автоматическая ОБРЕЗКА каждого изображения разумным образом, чтобы вырезать ненужные поля. Любые подсказки приветствуются, потому что ручная обрезка скучна и отнимает много времени.
В реестре плагинов GIMP был плагин, который делал это. Теперь он заархивирован здесь .
Некоторое время назад я перевел это на Python, и он работал намного быстрее.
Вот результат его применения к изображению в исходном вопросе:
Вот результат его применения к изображению в ответе Алана:
В любом случае вот код плагина:
from __future__ import division
import random
import gimp, gimpfu
pdb = gimp.pdb
sample_count = 100
def set_image_background_to_white(image, drawable):
pdb.gimp_context_push()
pdb.gimp_image_undo_group_start(image)
pdb.gimp_progress_set_text('Correcting background')
if drawable.is_gray:
channel_count = 1
elif drawable.is_rgb:
channel_count = 3
assert not drawable.is_indexed
# get some random points in the image
sum_by_channel = [0]*channel_count
for sample_index in range(sample_count):
px = pdb.gimp_drawable_get_pixel(drawable,
random.randint(0, pdb.gimp_drawable_width (drawable)-1),
random.randint(0, pdb.gimp_drawable_height(drawable)-1))[1]
for i in range(channel_count):
sum_by_channel[i] += px[i]
pdb.gimp_progress_update(sample_index/sample_count)
if drawable.is_gray:
pdb.gimp_levels(drawable, gimpfu.HISTOGRAM_VALUE,
0, sum_by_channel[0]/sample_count,
1.,
0, 255)
elif drawable.is_rgb:
for i in range(channel_count):
pdb.gimp_levels(drawable, 1+i,
0, sum_by_channel[i]/sample_count,
1.,
0, 255)
pdb.gimp_levels(drawable, gimpfu.HISTOGRAM_VALUE,
0, 255,
0.6,
0, 255)
pdb.gimp_image_undo_group_end(image)
pdb.gimp_displays_flush()
pdb.gimp_progress_update(1.)
pdb.gimp_context_pop()
gimpfu.register('set_image_background_to_white', # name
'Set image background to white', # blurb
'No help info yet', # help
'Robert Fleming', # author
'Robert Fleming', # copyright
'2015', # date
'<Image>/Filters/Set Background to White', # menupath
'RGB*, GRAY*', # imagetypes
[], # params
[], # results
set_image_background_to_white, # function
)
gimpfu.main()
Просто попробуйте с фотошопом. режим шкалы серого.
Адам Шульд
пользователь41141