У мене є деякі старі документи, які були відскановані, і я хочу їх перетворити на чорно-білі. Вміст має бути завжди чорним, а фон білим:
Я використовую Photoshop.
У мене є деякі старі документи, які були відскановані, і я хочу їх перетворити на чорно-білі. Вміст має бути завжди чорним, а фон білим:
Я використовую Photoshop.
Відповіді:
Якщо у вас є контроль над скануванням, або ви можете їх змінити, збільште налаштування контрастності при скануванні та встановіть чорну точку на найтемніший біт тексту, який ви можете знайти. Це полегшило б кроки нижче. Якщо ні, читайте далі ...
Ось частина досить типового сканування старого документа:
Деталі будуть різними залежно від документа (наприклад, це дещо вищий контраст, ніж ваш зразок), але широкий контур буде однаковим.
Зауважте, що повзунок жовтіє далеко вправо, освітлюючи жовтуватий фон. Я зміг лише трохи затемнити текст.
Це дає вам 95% шляху туди. Відсканований документ, як правило, має гістограму з великим грудком вправо (папір) і меншим грудком вліво (текст). Вам доведеться поекспериментувати зі своїми документами, щоб знайти правильні налаштування.
З цього моменту ви можете дублювати зображення, вирівнювати дублікат та використовувати звичайні інструменти для ретушування Photoshop, щоб очистити залишки.
Ви згадуєте Photoshop, але у випадку, коли вас це цікавить, є також плагін GIMP, який здійснює вдосконалене очищення та обробку відтінків сірого:
Він називається Nuvola Tools , і в основному зосереджений на сканованому мистецтві, але ви можете спробувати.
Перед:
Після:
Джерело: Реєстр плагінів GIMP
З GIMP:
Я спробував різні згадані методи в т.ч. безкоштовний FineThreshold http://www.mehdiplugins.com/english/finethreshold.htm плагін. Цей плагін швидко дає хороші результати за умови, що документ однорідно освітлений, а сам папір також має однорідну якість. Однак це було не моєю справою. Я переконався, що верхня сторона кожного документа була світлішою, ніж нижня. Отже, кожен метод та його часткове налаштування спрацювали лише для частини кожної сторінки, а не для решти її.
Врешті-решт я знайшов ефект "Динамічний поріг", який є частиною Zoner Photo Studio v15 . Її версія eval на деякий період безкоштовна, я думаю. Здається, компенсувати поріг в / ч відповідно до легкості в околицях. Її застосування є лише поетапним процесом. Для мене параметри "Large, value +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()