从numpy图片创建开罗曲面的正确方法是什么?

问题描述

我需要在现有图像上绘制圆,该图像存储为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)

circle

所以,问题是:

  1. 如何固定圆圈的颜色?具体如何使用开罗绘制红色圆圈,然后使用matplotlib显示红色圆圈?
  2. 如何确保代码在小端和大端平台上都能正常工作?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)