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

Hap*_*ppy 7 python camera opencv numpy

我正在玩一台使用Micro-Manager 1.4的显微镜相机.使用Python界面,我设法访问相机,更改曝光时间等,我可以捕获单个图像.

但是,每个图像作为NumPy数组返回,其中每个像素表示为单个整数,例如"7765869".据我所知,这在Java中被称为"BufferedImage",它意味着RGB值被编码为:

BufferedImage = R * 2^16 + G * 2^8 + B
Run Code Online (Sandbox Code Playgroud)

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

Jai*_*ime 8

最简单的是让numpy为你做转换.你的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)
Run Code Online (Sandbox Code Playgroud)

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

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