Mam ciąg szesnastkowy "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49", aby być konkretnym, będzie zawierał dane obrazu.

Chcę przekonwertować go na tablicę Numpy lub ewentualnie zrekonstruować obraz OpenCV na podstawie wspomnianych danych.

Szerokość i wysokość również zostaną podane, aby znane były wymiary tablicy Numpy.

Jak mogę skonstruować tablicę Numpy z powyższego ciągu?

4
moki 1 kwiecień 2020, 14:22

5 odpowiedzi

Najlepsza odpowiedź

Moglibyśmy użyć np.fromiter i rzutować poszczególne ciągi na szesnastkowe, używając argumentu base w int, a następnie do typu całkowitego przy użyciu argumentu dtype w np.fromiter:

s = "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49"

np.fromiter((int(x, 16) for x in s.split('-')), dtype=np.int32)
# array([137,  80,  78,  71,  13,  10,  26,  10,   0,   0,   0,  13,  73])
3
yatu 1 kwiecień 2020, 11:30
import numpy as np
arr = np.array([int(x, 16) for x in "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49".split("-")])
print(arr)
0
Mohammed Shabeer kp 1 kwiecień 2020, 11:31

Możesz split ciąg za pomocą myślnika i konwertować poszczególne liczby o podstawie 16 na int.

>>> import numpy as np
>>> hext_str = "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49"
>>> np.array([int(x, 16) for x in hex_str.split("-")])
array([137,  80,  78,  71,  13,  10,  26,  10,   0,   0,   0,  13,  73])

Pod warunkiem, że (n, m) są wymiarami Twojego obrazu, możesz użyć metody .reshape((n, m)) z np.array.

0
taras 1 kwiecień 2020, 11:32

Możesz użyć rozumienia listy i wbudowanego int do konwersji podzielonego ciągu z szesnastkowego na dziesiętny:

import numpy as np

hex_string = '89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49'
np.array([int(x, base=16) for x in hex_string.split('-')])
0
RMPR 1 kwiecień 2020, 11:37

Jeśli zależy Ci na wydajności pamięci, dwie cyfry w liczbie szesnastkowej odpowiadają 8-bitowej liczbie całkowitej bez znaku (tj. Liczbom z zakresu od 0 do 255).

Aby powrócić do oryginalnego ciągu, możesz użyć format(number, '02x') (ciąg liczb szesnastkowych o długości 2 z polami zerowymi)

hex_str = "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49"
arr = np.fromiter((int(x, 16) for x in hex_str.split('-')), dtype=np.uint8)
# array([137,  80,  78,  71,  13,  10,  26,  10,   0,   0,   0,  13,  73],
      dtype=uint8)

Tablica zajmowałaby tylko 13 bajtów miejsca, w przeciwieństwie do domyślnego typu tablicy dla liczb całkowitych (np.int64), który zajmowałby 104 bajty.

Kiedyś można było przywrócić go do pierwotnej postaci ciągu w następujący sposób:

hex_str = '-'.join((format(x, '02x') for x in arr)).upper()
0
M.T 3 październik 2020, 17:38