スキャンされた古いドキュメントがいくつかあり、それらを白黒に変換したい。コンテンツは常に黒で、背景は白でなければなりません:
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 dpiレーザープリンターで優れたコントラストで結果を印刷することができました。
今、私が探している唯一の残りのタスクは、不必要なマージンを切り取るための賢明な方法ですべての画像の自動CROPです。手作業でのトリミングは退屈で時間がかかるため、ヒントは大歓迎です。
これを行うプラグインが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()