Я использую технику скользящего окна для изображения и извлекаю средние значения пикселей для каждого окна. Итак, результаты примерно такие [[[[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 ответ
Удобочитаемый вариант
Предполагая, что вы хотите, чтобы данные были удобочитаемы, сохранение данных потребует немного больше работы. Мой поиск показал мне, что есть это решение. для сохранения 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')
.
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.