问题描述
我需要在现有图像上绘制圆,该图像存储为numpy数组。为此,我使用Cairo库,因为它支持抗锯齿并允许设置圆的粗细。
但是当我尝试设置圆圈的颜色时会出现问题。 Matplotlib要求颜色存储为RGB(或RGBA),因此红色对应于numpy数组中的索引0,蓝色对应于2。我有小端系统(sys.byteorder
返回'little'
),因此图像实际上作为ABGR存储在numpy数组的内存中。
但是,使用FORMAT_ARGB32
时,Cairo假定图像以ARGB的形式存储在内存中,因此红色和蓝色混合在一起。 FORMAT_RGB24
的唯一区别是忽略了Alpha通道,因此无济于事,结果是相同的。
问题在于Cairo使用原始内存进行操作,并且忽略了numpy数组的索引。因此,在这种情况下,matplotlib和cairo似乎都使用RGB顺序,但彼此不兼容。还有其他方法可以从numpy数组创建ImageSurface吗?
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import cairo
import math
width,height = 32,32
image = np.zeros((height,width,4),dtype=np.uint8)
# Red dot is drawn successfully
image[0,0] = 255 # R
image[0,1] = 0 # G
image[0,2] = 0 # B
image[0,3] = 255 # A
surface = cairo.ImageSurface.create_for_data(image,cairo.FORMAT_ARGB32,height)
cr = cairo.Context(surface)
cr.arc(width / 2,height / 2,10,2*math.pi)
cr.set_line_width(2)
# Circle is drawn blue instead of red
cr.set_source_rgb(1.0,0.0,0.0)
cr.stroke()
plt.imshow(image)
所以,问题是:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)