У меня есть несколько старых документов, которые были отсканированы, и я хочу преобразовать их в черно-белые. Контент должен быть всегда черным, а фон белым:
Я использую Photoshop.
У меня есть несколько старых документов, которые были отсканированы, и я хочу преобразовать их в черно-белые. Контент должен быть всегда черным, а фон белым:
Я использую Photoshop.
Ответы:
Если у вас есть контроль над сканированием, или вы можете отсканировать его, увеличьте настройку контрастности при сканировании и установите черную точку на самом темном бите текста, который вы можете найти. Это сделало бы шаги ниже легче. Если нет, то читайте дальше ...
Вот часть довольно типичного сканирования старого документа:
Детали будут различаться в зависимости от документа (например, он несколько более контрастен, чем ваш образец), но общий контур будет таким же.
Обратите внимание, что ползунок желтого цвета находится далеко вправо, осветляя желтоватый фон. Мне удалось лишь немного затемнить текст.
Это дает вам 95% пути туда. Отсканированный документ обычно имеет гистограмму с большим выступом справа (бумага) и меньшим выступом слева (текст). Вам придется экспериментировать с вашими документами, чтобы найти правильные настройки.
С этого момента вы можете дублировать изображение, сгладить его и использовать обычные инструменты ретуширования Photoshop, чтобы очистить оставшуюся часть.
Вы упомянули Photoshop, но в случае, если вам интересно, есть также плагин GIMP, который выполняет расширенную очистку и обработку в оттенках серого:
Он называется Nuvola Tools и в основном сфокусирован на сканированном искусстве, но вы можете попробовать его.
До:
После:
Источник: Реестр плагинов GIMP
С GIMP:
Я пробовал различные упомянутые методы вкл. бесплатный FineThreshold http://www.mehdiplugins.com/english/finethreshold.htm плагин. Этот плагин быстро дает хорошие результаты при условии, что документ освещен однородно, а сама бумага также однородного качества. Однако это был не мой случай. Я понял, что верхняя сторона каждого документа была более светлой, чем нижняя. Следовательно, каждый метод и его частичная настройка работали хорошо только для части каждой страницы, а не для остальной части.
В конце концов я обнаружил эффект «Динамический порог», который является частью Zoner Photo Studio v15 . Я полагаю, что его версия на некоторое время бесплатна. Кажется, он компенсирует ч / б порог в соответствии с яркостью соседства. Его применение только за один шаг. Для меня параметры «Большой, значение +14» работали очень хорошо. Помимо «Редактора» Zoner содержит также интерфейс «Менеджера», в котором вы можете обрабатывать пакет по всем выбранным изображениям. В итоге я смог напечатать результат на очень старом лазерном принтере с разрешением 300 точек на дюйм с превосходной контрастностью.
Теперь единственной оставшейся задачей, которую я ищу, является автоматическая обрезка каждого изображения разумным способом, чтобы обрезать ненужные поля. Любые советы приветствуются, потому что ручная обрезка скучна и требует много времени.
Был плагин в реестре плагинов 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()