如何用numpy将R,G,B值提取到单独的数组中

Sig*_*gma 6 python opencv numpy image

假设我有一个具有某个维度的图像(1920, 1080, 3),我想将R,G,B值提取到单独的数组中R , G, B.我试着这样做

for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            B = np.append(B, image[i, j][0])
            G = np.append(G, image[i, j][1])
            R = np.append(R, image[i, j][2])
Run Code Online (Sandbox Code Playgroud)

但正如预期的那样,这是非常缓慢的,我怎样才能在内置函数中使用numpy?

Zda*_*daR 14

如果你想要它的使用,OpenCV那么你可以使用cv2.split(),记住你的图像的渠道:

b, g, r    = cv2.split(image) # For BGR image
b, g, r, a = cv2.split(image) # for BGRA image
Run Code Online (Sandbox Code Playgroud)

或者,如果您可能喜欢直接numpy格式,那么您可以直接使用[根据@igaurav的评论,这似乎更有效]

b, g, r    = image[:, :, 0], image[:, :, 1], image[:, :, 2] # For RGB image
b, g, r, a = image[:, :, 0], image[:, :, 1], image[:, :, 2], image[:, :, 3] # for BGRA image
Run Code Online (Sandbox Code Playgroud)

您可以使用np.shape[2]检查给定图像中的通道数.

  • 从OpenCV站点:`警告cv2.split()是一项昂贵的操作(就时间而言)。因此,仅在需要时才这样做。否则,请进行Numpy索引。`来源:http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html (2认同)
  • 没关系,我已经弄清楚了。Numpy 方法使用 Numpy 切片,它创建一个新的(非常低效的)Numpy 数组“视图”,它指向旧 RAM 并表示“读取每个第三个字节,跳过第一个和第二个字节”以仅查看单个通道。这是“假分割”通道,但在图像处理方面效率极低。每次将假 r、g 或 b(以这种方式创建)传递给 OpenCV 或其他库函数时,都会导致每个函数调用有 30 毫秒的延迟,因为它必须将“作弊”Numpy 数据重新创建为真实的图像对象。同时,OpenCV 分割创建 3 个真实图像。 (2认同)

Dan*_*l F 7

dsplit 它.

import numpy as np

def channelSplit(image):
    return np.dsplit(image,image.shape[-1])

[B,G,R]=channelSplit(image)
Run Code Online (Sandbox Code Playgroud)

这适用于RGB或RGBA图像.