2

float 画像を使用していくつかの線を描画しています。

from PIL import Image, ImageDraw

im = Image.new("F", (64, 64), 0)
draw = ImageDraw.Draw(im)
draw.line((0, 0, 64, 64), 128, 5)
draw.line((0, 64, 64, 0), 128, 5)
im.show()

間違った結果

ただし、行を積み重ねることはありません。両方の線画から値が加算された結果を出したいです。

期待される結果

2つのfloat画像をadd_moduloしてみました

from PIL import Image, ImageDraw, ImageChops
im1 = Image.new("F", (64, 64), 0)
draw = ImageDraw.Draw(im1)
draw.line((0, 0, 64, 64), 128, 5)

im2 = Image.new("F", (64, 64), 0)
draw = ImageDraw.Draw(im2)
draw.line((0, 64, 64, 0), 128, 5)

im = ImageChops.add_modulo(im1, im2)

しかし、Pillow は a を上げていますValueError: image has wrong mode(そして、それは多くの行にとって非効率的です)。

ピクセルの追加を行うために 2 つの画像を反復処理する以外に、それを行う方法はありますか?

編集:同じ問題が発生している ようscikit-imageですので、それに関連する解決策も受け入れます。

4

2 に答える 2

2

draw モジュールを使用して座標と値を生成し、それらを画像に追加できます (これは単なる標準的な numpy 配列です)。

from skimage.draw import line_aa
import matplotlib.pyplot as plt
import numpy as np

image = np.zeros((64, 64), dtype=float)

for (rr, cc, val) in [line_aa(0, 0, 63, 63),
                      line_aa(63, 0, 0, 63)]:
    image[rr, cc] += val

image /= image.max()

plt.imsave("/tmp/out.png", image, vmin=0, vmax=1, cmap='gray')

より広い線を描画する必要がある場合は、そのような機能がありますが、現在はmeasureサブモジュールに少し隠されています. 役に立つと思われる場合は、描画モジュールで公開できることを嬉しく思います。

于 2014-07-09T10:59:32.147 に答える
0

Pillow の代わりにcairo グラフィックス ライブラリとそのPython バインディングを使用します。合成オペレータ設定できます。

ImageSurfaceビットマップ イメージが必要な場合は、 を作成します。メソッドを使用して、それをPNGファイルに書き込むことができますwrite_to_png

于 2014-07-08T20:26:28.460 に答える