在枕头中堆叠浮动图像的线条图

时间:2014-07-04 09:51:31

标签: python python-imaging-library pillow scikit-image

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

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

wrong result

但是,它不会将第一行堆叠在一起。我希望得到一个结果,从两个线条图中添加值。

expected result

我试过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遇到了同样的问题,所以我也接受任何涉及它的解决方案。

2 个答案:

答案 0 :(得分:2)

您可以使用绘图模块生成坐标和值,然后 将它们添加到图像(这只是一个标准的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子模块中有点隐藏。如果您发现它有用,我很高兴在绘图模块中公开它。

答案 1 :(得分:0)

使用cairo graphics library及其Python bindings代替Pillow。它允许您set compositing operator。{/ p>

如果您想要位图图片,请创建ImageSurface。您可以使用write_to_png方法将其写入PNG文件。