我使用浮动图像绘制一些线条。
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
遇到了同样的问题,所以我也接受任何涉及它的解决方案。
答案 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文件。