如何将图像存储为每个颜色通道的 ndarray?

How can you store an image as a ndarray of each of its colour channels?

我目前正在尝试获取图像并将其保存到每个颜色通道 (RGB) 的数组中。当我将图像附加到列表时,它会将每个像素的三个颜色通道存储在一起。我想知道如何将它们分开?

当前代码

img = cv2.imread(f'Data/keyboard/00{i+1:02d}.jpg') 
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)   # BGR -> RGB  
imgdata.append([img,"keyboard"])

print(trainData[0][0][0])

当前输出

 [185, 233, 255]
 [185, 233, 255]
 [185, 233, 255]
 ...
 [189 229 254]

需要格式

Red = [[185,185,16,...,189],[185,185,16,...,185],...]
Green = [[233,233,233,...,229],[233,233,233,...,229],...]
Blue = [[255,255,255,...,254],[255,255,255,...,254],...]

在使用 cv2 加载图像并执行颜色转换后,您可以使用 img.shape 验证其尺寸,其形式为 W, H, 3,其中 3 代表R、G 和 B 颜色通道。

现在要分离颜色,您可以首先使用以下代码

将图像数据重新整形为二维 (W*H, 3)
w, h, channels = img.shape
img_reshaped = img.reshape((w * h, channels)) 

这样每个条目将是 [R, G, B]。但是,要仅提取 RGB,您可以分别使用第二维索引 0、1 或 2。
例如,要提取所有红色值,您可以使用 reds = img_reshaped[:, 0]

如果您需要将其扩展到多个图像,您可以调用 extend() 函数或使用使用 np.zeros()

初始化为正确大小的 NumPy 数组
  • 不要cvtColor。没必要,所以没用。
  • 不要重塑为 (w*h, channels)。没必要,所以没用。

甚至 cv.split 也不是绝对必要的,因为它(几乎)等同于 numpy 切片。 Numpy 切片创建视图,而 cv.split 创建副本。创建副本在这里可能没有用。

# given:
#img = cv2.imread(f'Data/keyboard/00{i+1:02d}.jpg')
# order is BGR

red = img[:,:,2]
green = img[:,:,1]
blue = img[:,:,0]

这些是 切片 ,一个麻木的东西。您现在可以随心所欲地使用它们,例如附加到列表中。

reds = []
greens = []
blues = []

for img in images:
    reds.append(img[:,:,2])
    greens.append(img[:,:,1])
    blues.append(img[:,:,0])

reds = np.array(reds)
greens = np.array(greens)
blues = np.array(blues)

如果您需要展平这些数组,您可以这样做。你通常不需要。你需要什么取决于你要用它做什么。你还没解释呢。