如何将图像存储为每个颜色通道的 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]
。但是,要仅提取 R
、G
或 B
,您可以分别使用第二维索引 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)
如果您需要展平这些数组,您可以这样做。你通常不需要。你需要什么取决于你要用它做什么。你还没解释呢。
我目前正在尝试获取图像并将其保存到每个颜色通道 (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]
。但是,要仅提取 R
、G
或 B
,您可以分别使用第二维索引 0、1 或 2。
例如,要提取所有红色值,您可以使用
reds = img_reshaped[:, 0]
如果您需要将其扩展到多个图像,您可以调用 extend()
函数或使用使用 np.zeros()
- 不要
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)
如果您需要展平这些数组,您可以这样做。你通常不需要。你需要什么取决于你要用它做什么。你还没解释呢。