在Python中将单个整数像素数组转换为RGB三元组

2024-10-01 13:42:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在玩一个使用MicroManager1.4的显微镜摄像头。使用Python接口,我已经成功地访问了相机,改变了曝光时间等,我可以捕捉到个别的图像。在

然而,每个图像返回为NumPy数组,其中每个像素表示为单个整数,例如“7765869”。据我在网上找到的,这在Java中被称为“BuffereImage”,这意味着RGB值编码为:

BufferedImage = R * 2^16 + G * 2^8 + B

我的问题是:如何使用Numpy或OpenCV,将这种数组转换成更方便的数组,其中每个像素都是uint8值的RGB三元组?不用说,转换应该尽可能高效。在


Tags: 图像numpy编码时间整数rgb像素数组
3条回答
rgbs = [((x&0xff0000)>>16,(x&0xff00)>>8,x&0xff) for x in values]

至少我认为。。。在

上述公式也可以写成

^{pr2}$

这对我来说更易读,也更清楚发生了什么

一种方法是

Red = BufferedImage / 2**16
Green = (BufferedImage % 2**16) / 2**8
Blue = (BufferedImage % 2**8)

然而,我怀疑它是最优雅的(Python?)或者最快的方法。在

最简单的方法就是让纽比帮你做转换。你的numpy数组可能是np.uint32类型。如果您将其视为np.uint8的数组,那么您将得到一个RGB0格式的图像,即每个像素的R、G和B值,加上后面一个空的np.uint8。很容易重塑和丢弃零值:

>>> img = np.array([7765869, 16777215], dtype=np.uint32)
>>> img.view(np.uint8)
array([109, 127, 118,   0, 255, 255, 255,   0], dtype=uint8)
>>> img.view(np.uint8).reshape(img.shape+(4,))[..., :3]
array([[109, 127, 118],
       [255, 255, 255]], dtype=uint8)

最好的是没有计算或复制数据,只是对原始图像内容的重新解释:我认为你没有比这更有效的了!在

我记得,对于某些操作OpenCV需要一个连续数组,所以您可能需要在表达式的末尾添加一个.copy()来真正消除零列,而不是简单地忽略它,尽管这当然会触发上面代码避免的数据拷贝。在

相关问题 更多 >