OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式

以最简单的4 x 5三通道图像为例,其在内存中Mat类型的数据组织形式如下:

 

每一行的每一列像素的三个通道数据组成一个一维数组,一行像素组成一个二维数组,整幅图像组成一个三维数组,即:

Mat.data[4, 5, 3] = [

[[B0, G0, R0],[B1, G1, R1],[B2, G2, R2],[B3, G3, R3],[B4, G4, R4]],

[[B5, G5, R5],[B6, G6, R6],[B7, G7, R7],[B8, G8, R8],[B9, G9, R9]],

[[B10, G10, R10],[B11, G11, R11],[B12, G12, R12],[B13, G13, R13],[B14, G14, R14]],

[[B15, G15, R15],[B16, G16, R16],[B17, G17, R17],[B18, G18, R18],[B19, G19, R19]]

]

我们通过python单独访问每个通道的数据可以采用切片(Slice)操作的方是:

img_blue   = img_mat[:, :, 0]

img_green = img_mat[:, :, 1]

img_red    = img_mat[:, :, 2]

上述代码有些抽象,启动python我们模拟操作一下,控制台输入python,进入shell,导入numpy(import numpy as np),然后输入如下语句:

a = np.arange(36).reshape(4, 5, 3)

我们模拟了一个4行、3列、3通道的图像数据,其内容如下:

image

我们随便取一通道的数据,比如BGR三通道的G通道,也就是第2个通道,继续在python的shell界面输入如下指令:

a[:, :, 1]

数据如下:

image

上述数据是一个二维数组:每一行的G通道数据组成一个一维数组,整幅图像的G通道数据组成一个二维数组。

posted @ 2018-09-29 21:09  Neo-T  阅读(1570)  评论(0编辑  收藏  举报