#python #arrays #numpy #binaryfiles
#python #массивы #numpy #двоичные файлы
Вопрос:
Моя главная цель — создать .необработанная маска из двух списков значений x и y для каждой точки рентабельности инвестиций. Эти списки представлены следующим образом:
x_vals = [94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 106, 106, 107, 108, 108, 109, 110, 111, 111, 112, 112, 112, 111, 110, 109, 108, 108, 107, 106, 105, 105, 104, 104, 104, 103, 102, 101, 100, 99, 99, 99, 99, 98, 98, 98, 99, 99, 100, 100, 101, 101, 102, 103, 103, 104, 105, 105, 106, 107, 107, 108, 109, 109, 109, 109, 109, 109, 108, 107, 107, 106, 105, 105, 105, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 119, 120, 120, 119, 118, 117, 116, 115, 114, 113, 112, 112, 112, 111, 111, 110, 110, 109, 109, 109, 109, 110, 110, 110, 111, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 116, 117, 117, 118, 118, 117, 117, 116, 115, 114, 113, 112, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 99, 98, 97, 96, 95]
y_vals = [51, 51, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 53, 53, 54, 55, 55, 55, 55, 55, 54, 53, 53, 53, 54, 54, 55, 56, 56, 56, 56, 56, 56, 57, 58, 59, 59, 60, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 69, 70, 71, 72, 72, 72, 73, 73, 73, 74, 75, 75, 75, 75, 75, 75, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 73, 73, 72, 72, 72, 72, 72, 72, 71, 71, 71, 70, 69, 69, 68, 67, 66, 66, 65, 64, 63, 63, 62, 61, 61, 60, 59, 59, 58, 58, 57, 57, 56, 56, 55, 55, 54, 53, 53, 52, 52, 51, 51, 50, 50, 50, 50, 50, 50, 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49]
Я уже сделал это, создав массив из списка:
import numpy as np
def make_array_from_list(x_values, y_values):
points = []
for i in range(len(x_values)):
tmp = []
tmp.append(x_values[i])
tmp.append(y_values[i])
points.append(tmp)
np_points = np.array(points)
return np_points
arr = make_array_from_list(x_vals, y_vals)
чем заполнять поли:
def make_mask_from_points(num, shape, points):
img = np.zeros((num, shape), np.uint8)
mask = cv2.fillPoly(img, [points], (255, 255, 255))
return mask
mask = make_mask_from_points(112, 162, arr1)
и в ответ мое изображение считывается с помощью этого кода:
zer = np.zeros((112, 162, 162), np.uint8)
zer[:,:,85] = mask
import matplotlib.pyplot as plt
def showImage(image, isGray=False):
fig = plt.figure(figsize=(10, 10))
plt.imshow(image, cmap = 'gray')
plt.show()
showImage(zer[:,:,85])
До этого момента все идет хорошо. Теперь я хотел бы сохранить весь zer
массив в виде файла .raw (только 1 фрагмент является маской). Я пытался сделать это так:
zer.astype(np.uint8).tofile('mask.raw')
или проще так:
zer.tofile('mask.raw')
но когда я делаю это, после отображения его с помощью imagej или чтения с помощью этого кода:
path = '/mypath/mask.raw'
size = 112
size2 = 162
imgs = 162
nbytes = 1
def readBinaryData(n,SIZE, SIZE2, H,nbytes):
if nbytes==2:
d = np.zeros((SIZE,SIZE2,H),np.uint16)
elif nbytes==1:
d = np.zeros((SIZE,SIZE2,H),np.uint8)
else:
print('Wrong number of bytes per voxel')
return
f=open(n,"rb")
for i in range(0,H):
for j in range(0,SIZE):
for k in range(0,SIZE):
byte = f.read(nbytes)
if nbytes==2:
a = 256*byte[0] byte[1]
else:
a = byte[0]
d[j,k,i] = a
f.close()
return d
img = readBinaryData(path, size, size2, imgs, nbytes)
Я получаю какие-то сумасшедшие вещи:
Я знаю, что этот код работает, и я знаю, что imagej работает, потому что я открыл много масок с его помощью. Теперь мне впервые нужно создать свою собственную маску, и я не могу преодолеть этот последний, заключительный шаг…
Комментарии:
1. Нам не нужна предыстория. Это неуместно и отвлекает. Просто предоставьте образец массива с выполняемыми вами операциями, которые работают не так, как ожидалось.
2. Вся вещь make_array в основном
np.stack((a, b), -1).ravel()
3. Что вы ожидаете записать в файл? Что
tofile
делает, в вашем текущем ожидании?4.
np.stack((a, b), -1).ravel()
это совсем другое, но спасибо, я буду искать готовые решения. Я ожидаю получить файл .raw в виде 8-разрядного типа изображения5. Вы правы, вы не делаете
ravel
в конце