2

我正在使用浮动图像来绘制一些线条。

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()

错误的结果

但是,它不会将行堆叠在一起。我想要一个从两个线条图中添加值的结果。

预期结果

我试图 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 正在提高一个ValueError: image has wrong mode(这对于很多行来说效率很低)。

除了迭代两个图像来添加像素之外,还有其他方法吗?

编辑: 它似乎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

使用cairo 图形库及其Python 绑定而不是 Pillow。它允许您设置合成运算符。

ImageSurface如果需要位图图像,请创建一个。您可以使用该方法将其写入 PNG 文件write_to_png

于 2014-07-08T20:26:28.460 回答