【问题标题】:How can you store an image as a ndarray of each of its colour channels?如何将图像存储为每个颜色通道的 ndarray?
【发布时间】:2022-01-07 20:39:39
【问题描述】:

我目前正在尝试获取图像并将其保存到每个颜色通道 (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],...]

【问题讨论】:

标签: python numpy opencv


【解决方案1】:
  • 不要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]

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

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)

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

【讨论】:

    【解决方案2】:

    使用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]。但是,要仅提取 R、G 或 B,您将分别使用 0、1 或 2 的第二维索引。
    例如,要提取所有红色值,您可以使用 reds = img_reshaped[:, 0]

    如果您需要将其扩展到多个图像,您可以调用 extend() 函数或使用使用 np.zeros() 初始化为正确大小的 NumPy 数组

    【讨论】:

    • 可能不需要重塑。恕我直言,OP的问题尚不清楚。如果这是一个神经网络的输入,那么扁平化数据是没有意义的。 -- numpy 数组上的extend 总是意味着一个副本。如果这是在循环中执行的,最好不要这样做。标识符trainData 意味着这将应用于多个图像。
    猜你喜欢
    • 2017-07-12
    • 2021-11-05
    • 2013-12-22
    • 2017-10-10
    • 2015-08-04
    • 2019-02-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多