Python Base64 влияет на выходные данные - PullRequest
3 голосов
/ 28 мая 2020

У меня проблема с кодировщиком / декодером Base64, которого я не понимаю. Я передаю изображение, открытое:

image = open(IMAGE_PATH, "rb").read()
payload = {"image": image,
           "filename": os.path.basename(IMAGE_PATH),
           "extension": file_extension
r = requests.post(KERAS_REST_API_URL, files=payload).json()

после передачи, изображение открывается REST API с помощью:

image = Image.open(io.BytesIO(image))
image = np.asarray(image)

, а затем передается в кодировщик Base64 => Все в порядке . См. Ниже результат функции кодировщика Base64

[[29477 29480 29443 ... 29465 29463 29473]
 [29473 29469 29440 ... 29481 29460 29441]
 [29434 29436 29452 ... 29459 29474 29444]
 ...
 [29455 29437 29440 ... 29439 29433 29481]
 [29451 29456 29441 ... 29469 29450 29452]
 [29472 29455 29440 ... 29433 29453 29459]]

[INFO] Image Shape : (768, 1024)
[INFO] Channel : 1
[INFO] Image Shape : (768, 1024)
[INFO] Image Shape Encode : (768, 1024)
[INFO] Image Shape Encode/Decode : (786432,)

Вместо передачи изображения с помощью «open (IMAGE_PATH,« rb »). Read ()» я хотел бы передать массив Numpy как мое изображение также будет изображением dicom.

Итак, я открываю файл изображения с помощью следующих команд:

image = np.asarray(Image.open(IMAGE_PATH))

и получаю полезную нагрузку:

payload = {"image": json.dumps(image, cls=NumpyArrayEncoder),
                       "filename": os.path.basename(IMAGE_PATH),
                       "extension": file_extension
                       }
requests.post line is unchanged.

В REST API, строка, которая читает изображение, становится:

image = request.files["image"].read()
image = json.loads(image)
image = np.asarray(image)

и затем передается в кодировщик Base64 без каких-либо изменений кода. Я получаю следующий результат

[[29477 29480 29443 ... 29465 29463 29473]
 [29473 29469 29440 ... 29481 29460 29441]
 [29434 29436 29452 ... 29459 29474 29444]
 ...
 [29455 29437 29440 ... 29439 29433 29481]
 [29451 29456 29441 ... 29469 29450 29452]
 [29472 29455 29440 ... 29433 29453 29459]]

[INFO] Image Shape : (768, 1024)
[INFO] Channel : 1
[INFO] Image Shape : (768, 1024)
[INFO] Image Shape Encode : (768, 1024)
[INFO] Image Shape Encode/Decode : (1572864,)

Наконец, у меня возникла проблема: когда я декодирую данные, форма больше не совпадает с ожидаемой формой (в 2 раза выше).

У вас есть подсказки по решению этой проблемы?

Спасибо

def base64_encode_image(a):
    # base64 encode the input NumPy array
    print("[INFO] Image Shape Encode : " + str(a.shape))
    a = base64.b64encode(a).decode("utf-8")
    a = bytes(a, encoding="utf-8")
    a = np.frombuffer(base64.decodebytes(a), dtype='int32')
    print("[INFO] Image Shape Encode/Decode : " + str(a.shape))
    return base64.b64encode(a).decode("utf-8")




def base64_decode_image(a, dtype, shape):
    if sys.version_info.major == 3:
        print("[INFO] Python 3")
        a = bytes(a, encoding="utf-8")
    # convert the string to a NumPy array using the supplied data
    # type and target shape
    a = np.frombuffer(base64.decodestring(a), dtype=dtype)
    print("[INFO] Image Shape Decode : " + str(a.shape))
    a = a.reshape(shape)
    # return the decoded image
    return a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...