Python-чтение изображений в матрицу изображений
Я пытаюсь прочитать несколько изображений rgb в одну матрицу, так что размеры матрицы (image_size, image_size, index), например,данные [:,:, 1] должны получить 1-е изображение.
data = np.zeros((image_dim, image_dim, numImages), dtype=np.float64)
for fname in os.listdir('images/sample_images/'):
name='....'
image=mpimg.imread(name)
data = np.append(data, image)
return data
Изображение.форма = (512, 512, 3)
данные.форма = (512, 512, 100)
Помимо того, что np.append оставляет меня с пустым массивом данных, есть ли другой способ добавления значений массива изображений к матрице больших данных?
Заранее спасибо
3 ответов:
Пост Фалько, безусловно, является каноническим способом сделать это. Однако, если я могу предложить более
numpy/ Питонный способ сделать это, я бы позволил первому измерению быть индексом изображения, которое вы хотите, в то время как второе и третье измерения будут строками и столбцами изображения, и, возможно, четвертое измерение будет цветовым каналом, который вы хотите. Поэтому, предположив, что ваше изображение имеет размерыM x Nи у вас естьKизображения, вы создадите матрицу, которая будетK x M x Nдлинной илиK x M x N x 3длинной в случай цветных изображений.Таким образом, простой однострочный в
numpyможет быть таким, учитывая ваш текущий код:Таким образом, если вы хотите получить доступ к I - му образу, вы просто сделаетеdata = np.array([mpimg.imread(name) for name in os.listdir('images/sample_images/')], dtype=np.float64)data[i]. Это будет работатьнезависимо от того, является ли изображение RGB или оттенками серого... таким образом, выполнивdata[i], вы получите изображение RGB или изображение в оттенках серого, в зависимости от того, что вы решили использовать для упаковки массива. Однако вы должны убедиться, что все изображения соответствуют друг другу... То есть они все цветные или все оттенки серого.Однако, чтобы показать вам, что это работает, давайте попробуем это с
5 x 5 x 3"RGB" изображениями, где каждое начинается с0и увеличивается доK-1, гдеKв этом случае будет 10:data = np.array([i*np.ones((5,5,3)) for i in range(10)], dtype=np.float64)Давайте посмотрим пример выполнения (в IPython):
In [26]: data = np.array([i*np.ones((5,5,3)) for i in range(10)], dtype=np.float64) In [27]: data.shape Out[27]: (10, 5, 5, 3) In [28]: img = data[0] In [29]: img Out[29]: array([[[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]], [[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]], [[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]], [[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]], [[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]]]) In [30]: img.shape Out[30]: (5, 5, 3) In [31]: img = data[7] In [32]: img Out[32]: array([[[ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.]], [[ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.]], [[ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.]], [[ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.]], [[ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.], [ 7., 7., 7.]]]) In [33]: img.shape Out[33]: (5, 5, 3)В приведенном выше примере я создал образец массива данных, и это
10 x 5 x 5 x 3, как мы и ожидали. У нас есть 10 матриц5 x 5 x 3. Затем я извлекаю первое изображение "RGB", и все это 0s, как мы ожидайте, с размером5 x 5 x 3. Я также извлекаю восьмой кусочек, и мы все получаем 7s, как и ожидали, с размером5 x 5 x 3.Очевидно, выберите тот ответ, который вы считаете лучшим, но я лично пошел бы с вышеуказанным маршрутом, поскольку индексирование в Ваш массив, чтобы захватить правильное изображение, проще - вы позволяете вещанию измерений делать работу за вас.
Лучше использовать
dstackдля укладки массивов в 3-м измерении:data = np.zeros((3, 3, 0)) for i in range(5): image = np.random.rand(3, 3, 1) data = np.dstack((data, image)) print data.shapeВывод:
Примечание: здесь я предполагаю, что каждое (случайное) изображение имеет один канал. Если у вас есть изображения RGB, вы получите в итоге в 3 раза больше результирующих каналов, т. е. форму(3, 3, 5)(3, 3, 15).
Как читать изображения с диска в матрицу NumPy 4D (для машинного обучения):
Во-первых, метод утилиты (мои изображения 14x64px имеют 3 канала каждый, форма изображения(14, 64, 3)):
def read_image(image_path): # cv2.IMREAD_COLOR # cv2.COLOR_BGR2GRAY image = cv2.imread(image_path, cv2.IMREAD_COLOR) #print("image shape", image.shape) #plt.imshow(image, cmap='gray') #plt.show() return np.array(image)Далее я помещаю все свои изображения в 4-мерную матрицу NumPy:
training_features = np.array([read_image(path) for path in image_paths])Результирующая форма матрицы (5626, 14, 64, 3), он имеет 5626 14x64px цветных изображений.
Comments