首页 > 解决方案 > Numpy:如何将颜色矩阵转换为扁平向量

问题描述

我正在尝试使用 sklearn 的 Mean Shift 算法分割彩色图像。我有以下代码:

import cv2
import numpy as np
from sklearn.cluster import MeanShift, estimate_bandwidth
from sklearn.datasets.samples_generator import make_blobs
import matplotlib.pyplot as plt
from itertools import cycle
from PIL import Image

image = Image.open('sample_images/fruit_half.png').convert('RGB')
image = np.array(image)

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

我已阅读图像并将其转换为 numpy 数组。然后我提取了每个颜色通道(R、G、B),以便我可以将每个颜色通道用作分类变量。

我想把上面的颜色矩阵转换成一个扁平的向量,因为我想把它用作分类的变量。例如,如果原始图像是 100x100,那么展平的颜色样本矩阵将是 10000 x 3。

我不想将每个矩阵转换为自己的向量;我想将所有三种颜色矩阵制成一个扁平向量。

但是,我不确定我可以使用什么方法来做到这一点。任何见解都值得赞赏。

标签: pythonnumpyopencvscikit-learncomputer-vision

解决方案


您可以重塑数组以获得所需的效果:

img = NP.zeros((100, 100, 3), dtype='int')
img[:,:,0] = NP.arange(0, 10000).reshape(100, 100)
img[:,:,1] = 1
img[:,:,2] = 2

展平图像,使每种颜色都是一列(即 10000 x 3):

img.reshape(-1, 3)

输出:

array([[    0, 22222, 33333],
       [    1, 22222, 33333],
       [    2, 22222, 33333],
       ...,
       [ 9997, 22222, 33333],
       [ 9998, 22222, 33333],
       [ 9999, 22222, 33333]])

要转换为 3 x 10000 数组,您可以使用:

img.transpose(2, 0, 1).reshape(3, -1)

输出:

array([[    0,     1,     2, ...,  9997,  9998,  9999],
       [22222, 22222, 22222, ..., 22222, 22222, 22222],
       [33333, 33333, 33333, ..., 33333, 33333, 33333]])

推荐阅读