Как преобразовать список целых чисел в изображение? - PullRequest
0 голосов
/ 05 февраля 2020

Я использую сканер отпечатков пальцев SFM5020 и использую библиотеку pysfm. У меня есть функция, которая считывает данные отпечатков пальцев и выдает данные шаблона длиной 10909 в виде списка. Я хочу преобразовать это в изображение. Не могли бы вы помочь мне в этом?

Я не знаю высоты и ширины, я просто знаю длину данных шаблона, которая составляет 10909. Вот раздел таких данных шаблона:

template_data = [16, 1, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 255, 63, 240, 199, 127, 255, 23, 255, 255, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, 249, 255, 255, 255, 255, 227, 127, 224, 15, 254, 248, 7, 254, 247, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ,.................................. 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0]

Не могли бы вы помочь мне преобразовать template_data в изображение?

1 Ответ

3 голосов
/ 05 февраля 2020

Здесь приводится обоснованное предположение, которое было слишком длинным для комментария.

Из спецификаций SFM5020 имеет размер изображения 272 x 320. Это было бы 87.040 пикселей в общей сложности. У вас есть 10,909 байт данных, что составляет 87,272 бита. Итак, кажется, данные пикселей хранятся в двоичном виде, то есть каждый байт представляет восемь последовательных пикселей.

Теперь у вас есть 29 дополнительных байтов (87,272 бит - 87,040 пикселей = 232 бит = 29 байтов). Давайте посмотрим на ваши template_data: первые 28 байтов являются более или менее нулями. Начиная с байта 29, их много. Это может быть "белый" фон. Глядя на конец, у вас есть один ноль. Раньше там тоже много "белого". Поэтому, скорее всего, отбросьте первые 28 байтов и последний байт для извлечения фактических данных отпечатка пальца.

В приведенном примере и в предположении, что данные непрерывны для каждой строки, мы можем извлечь две строки:

import numpy as np
from PIL import Image

# Data
head = [16, 1, 0, 0, 64, 1, 0, 0,                   # Byte 0 - 7
        0, 0, 0, 0, 0, 0, 0, 0,                     # Byte 8 - 15
        1, 0, 0, 0, 0, 84, 1, 0,                    # Byte 16 - 23
        0, 0, 0, 0, 255, 255, 255, 255,             # Byte 24 - 31
        255, 255, 255, 255, 255, 255, 255, 255,     # ...
        15, 255, 63, 240, 199, 127, 255, 23,
        255, 255, 31, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255, 255,
        255, 255, 255, 255, 255, 31, 249, 255,
        255, 255, 255, 227, 127, 224, 15, 254,
        248, 7, 254, 247, 31, 255, 255, 255,
        255, 255, 255, 255, 255, 255, 255,
        255, 255]
# ... Rest of the data...
tail = [255, 255, 255, 255, 255, 255, 255, 255,     # Byte 10896 - 10903
        255, 255, 255, 255, 0]                      # Byte 10904 - 10908

# Unpack bits from bytes starting from byte 28
bits = np.unpackbits(np.array(head[28:len(head)]).astype(np.uint8)) * 255
#bits = np.unpackbits(np.array(template_data[28:-1]).astype(np.uint8)) * 255

# SFM5020 has image size of 272 x 320
# https://www.supremainc.com/embedded-modules/en/modules/sfm-5000.asp
w = 272
h = 320

# Extract fingerprint data from bits
fp = bits[0:2*w].reshape((2, w))
# fp = bits[0:h*w].reshape((h, w))

# Save fingerprint as image via Pillow/PIL
fp_pil = Image.fromarray(fp, 'L')
fp_pil.save('fp.png')

Сохраненное изображение (через подушку / PIL относительно ваших тегов) будет выглядеть так:

Output

Я не могу скажите, если это начало правильного отпечатка пальца. Возможно, просто попробуйте приведенный выше код на вашем фактическом template_data. Поэтому раскомментируйте две приведенные строки. Если отпечаток пальца выглядит странно, попробуйте fp = bits[0:h*w].reshape((w, h)).T. Это означает, что данные отпечатков пальцев хранятся непрерывно для каждого столбца.

Надеюсь, это поможет!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
NumPy:       1.18.1
Pillow:      7.0.0
----------------------------------------
...