не могу сохранить 4d массив int .txt файл - PullRequest
1 голос
/ 18 июня 2020

Я использую технику скользящего окна c для изображения и извлекаю средние значения пикселей каждого окна. Итак, результаты примерно такие [[[[215.015625] [123.55036272] [111.66057478]]]]. Теперь вопрос в том, как я могу сохранить все эти значения для каждого окна в текстовом файле или в CSV, потому что я хочу использовать их для дальнейшего сравнения сходств? что бы я ни пробовал, ошибка такая же .. что это 4D массив, а не 1D или 2D. Я буду признателен за любую помощь! Заранее спасибо

import cv2
import matplotlib.pyplot as plt
import numpy as np


# read the image and define the stepSize and window size
# (width,height)
image2 = cv2.imread("bird.jpg")# your image path

image = cv2.resize(image2, (224, 224))
tmp = image  # for drawing a rectangle
stepSize = 10
(w_width, w_height) = (60, 60 )  # window size
for x in range(0, image.shape[1] - w_width, stepSize):
    for y in range(0, image.shape[0] - w_height, stepSize):
        window = image[x:x + w_width, y:y + w_height, :]

        # classify content of the window with your classifier and
        # determine if the window includes an object (cell) or not
        # draw window on image
        cv2.rectangle(tmp, (x, y), (x + w_width, y + w_height), (255, 0, 0), 2)  # draw rectangle on image
        plt.imshow(np.array(tmp).astype('uint8'))
        # show all windows
        plt.show()
        mean_values=[]
        mean_val, std_dev = cv2.meanStdDev(image)
        mean_val = mean_val[:3]
        mean_values.append([mean_val])
        mean_values = np.asarray(mean_values)
        print(mean_values)

1 Ответ

1 голос
/ 18 июня 2020

Human Readable Option

Предполагая, что вы хотите, чтобы данные были удобочитаемыми, сохранение данных требует немного больше работы. Мой поиск показал мне, что существует это решение для сохранения 3D-данных в текстовый файл. Однако довольно просто расширить этот пример до 4D для вашего варианта использования. Этот код взят и адаптирован из этого поста, спасибо Джо Кингтону и Дэвиду Чунгу.

import numpy as np
data = np.arange(2*3*4*5).reshape((2,3,4,5))
with open('test.csv', 'w') as outfile:
    # We write this header for readable, the pound symbol
    # will cause numpy to ignore it
    outfile.write('# Array shape: {0}\n'.format(data.shape))

    # Iterating through a ndimensional array produces slices along
    # the last axis. This is equivalent to data[i,:,:] in this case.
    # Because we are dealing with 4D data instead of 3D data,
    # we need to add another for loop that's nested inside of the
    # previous one.
    for threeD_data_slice in data:
        for twoD_data_slice in threeD_data_slice:
            # The formatting string indicates that I'm writing out
            # the values in left-justified columns 7 characters in width
            # with 2 decimal places. 
            np.savetxt(outfile, twoD_data_slice, fmt='%-7.2f')
            # Writing out a break to indicate different slices...
            outfile.write('# New slice\n')

И затем, как только данные были сохранены, все, что вам нужно сделать, это загрузить их и изменить их форму (np.load() ) по умолчанию будет считывать данные как 2D-массив, но np.reshape() позволит нам восстановить структуру. Опять же, этот код адаптирован из предыдущего сообщения.

new_data = np.loadtxt('test.csv')
# Note that this returned a 2D array!
print(new_data.shape)

# However, going back to 3D is easy if we know the 
# original shape of the array
new_data = new_data.reshape((2,3,4,5))

# Just to check that they're the same...
assert np.all(new_data == data)

Двоичный вариант

Предполагая, что удобочитаемость человека не требуется, я бы рекомендовал использовать встроенный *.npy формат, который описан здесь . Это сохраняет данные в двоичном формате.

Вы можете сохранить массив, выполнив np.save('NAME_OF_ARRAY.npy', ARRAY_TO_BE_SAVED), а затем загрузить его с помощью SAVED_ARRAY = np.load('NAME_OF_ARRAY.npy').

Вы также можете сохранить несколько массивов numpy в один zip-файл с функцией np.savez(), например, np.savez('MANY_ARRAYS.npz', ARRAY_ONE, ARRAY_TWO). И вы загружаете заархивированные массивы аналогичным образом SEVERAL_ARRAYS = np.load('MANY_ARRAYS.npz').

...