0

私は基本的に奇妙な(灰色ではない)背景、たとえば緑または黄色(古い紙を考えてください)に黒で印刷されたスキャン画像を持っています。

緑/黄色を取り除き、元の画像の灰色の構造がそのままの状態で灰色の画像を受け取るにはどうすればよいですか? つまり、アンチエイリアシング効果または灰色の領域のために文字の周りの灰色を維持したいのですが、遠く離れた緑/黄色であっても真っ白にするために何かを変えたいですか?

バックグラウンドは決して均一ではないことに注意してください。そのため、アルゴリズムは色と誤差範囲または色の範囲を受け入れることができる必要があります。

ボーナス ポイント: 背景色を自動的に決定するにはどうすればよいですか?

Imaging Library または ImageMagick で Python を使用したいと考えています。

注: unpaperのようなパッケージを認識しています。unpaper に関する私の問題は、おそらく OCR ソフトウェアには適切に見えるが、人間の目には見えない白黒画像が生成されることです。

4

3 に答える 3

1

少し前に任意の背景色を透明にしたいと思っていたので、このスクリプトを開発しました。画像で最も人気のある (背景) 色を取得し、透明度が背景色からの距離に比例するアルファ マスクを作成します。RGB 色空間の距離を取得することは、大きな画像ではコストのかかるプロセスであるため、numpy と高速整数平方近似演算を使用して最適化を試みました。最初に HSV に変換するのが正しいアプローチかもしれません。問題をまだ解決していない場合は、これが役立つことを願っています。

from PIL import Image
import sys, time, numpy

fldr = r'C:\python_apps'
fp = fldr+'\\IMG_0377.jpg'

rz = 0  # 2 will halve the size of the image, etc..

# ----------------

im = Image.open(fp)

if rz:
    w,h = im.size
    im = im.resize((w/rz,h/rz))
    w,h = im.size

h = im.histogram()
rgb = r0,g0,b0 = [b.index(max(b)) for b in [ h[i*256:(i+1)*256] for i in range(3) ]]

def isqrt(n):
    xn = 1
    xn1 = (xn + n/xn)/2
    while abs(xn1 - xn) > 1:
        xn = xn1
        xn1 = (xn + n/xn)/2
    while xn1*xn1 > n:
        xn1 -= 1
    return xn1

vsqrt = numpy.vectorize(isqrt)

def dist(image):
    imarr = numpy.asarray(image, dtype=numpy.int32)  # dtype=numpy.int8
    d = (imarr[:,:,0]-r0)**2 + (imarr[:,:,1]-g0)**2 + (imarr[:,:,2]-b0)**2
    d = numpy.asarray((vsqrt(d)).clip(0,255), dtype=numpy.uint8)
    return Image.fromarray(d,'L')

im.putalpha(dist(im))
im.save(fldr+'\\test.png')
于 2009-05-30T20:50:00.320 に答える
1

私は python プログラマーというよりは C++ のほうが多いので、コード サンプルを提供することはできません。しかし、一般的なアルゴリズムは次のようなものです。

背景色を見つける: 画像のヒストグラムを作成します。ヒストグラムには、背景色と前景色を表す 2 つのピークが必要です。バックグラウンドの強度が高いことがわかっているため、強度の高いピークを選択します。これがバックグラウンド カラーです。これでRGB背景ができました(R_bg, G_bg, B_bg)

背景を白に設定: すべてのピクセルをループして、背景までの距離を計算します。

distance = sqrt((R_bg - R_pixel) ^ 2 + (G_bg - G_pixel) ^ 2 + (B_bg - B_pixel) ^ 2)

距離がしきい値よりも小さい場合は、ピクセルを白に設定します。良い結果が得られるまで、さまざまなしきい値を試すことができます。

于 2009-03-20T17:18:03.320 に答える