Numpy: Как преобразовать цветовые матрицы в плоский вектор - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь сегментировать цветное изображение, используя алгоритм Mean Shift, используя sklearn. У меня есть следующий код:

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]

Я прочитал изображение и преобразовал его в массив. Затем я выделил каждый цветовой канал (R, G, B), чтобы использовать его в качестве переменной для классификации.

Я хочу преобразовать приведенные выше цветовые матрицы в плоский вектор, поскольку хочу использовать его в качестве переменной для классификации. Например. если исходное изображение было 100x100, то матрица сглаженных образцов цвета будет 10000 x 3.

Я не хочу конвертировать каждую матрицу в свой собственный вектор; Я хочу, чтобы все три цветовые матрицы были объединены в один плоский вектор.

Однако я не уверен, какие методы я могу использовать для этого. Любые идеи приветствуются.

1 Ответ

2 голосов
/ 11 июля 2019

Вы можете изменить форму массива, чтобы получить желаемый эффект:

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]])
...