Сохраните numpy 3d массив как необработанный

#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 в конце