发送图像(作为 numpy 数组)'requests.post'



我对一件非常简单的事情感到有些困惑:我正在使用在线服务进行图像处理并发送我正在使用的图像

var_0 = requests.post(api_url, params=params, headers=headers, data=image_data)

其中image_data应编码为二进制字符串。例如,以下示例工作正常:

image_data = open(image_path, "rb").read()
var_0 = requests.post(api_url, params=params, headers=headers, data=image_data)

但是,在某些情况下,我需要在图像已经打开并且采用numpy.array格式时发送图像。

我应该如何转换我的图像以便能够通过请求发送?

在提供的链接中说明"支持的输入图像格式包括 JPEG、PNG、GIF(第一帧(s、BMP。因此,您的数据必须采用这些格式之一。数字数组不合适。它需要转换为例如PNG图像。

使用matplotlib.pyplot.imsave()功能最容易完成此操作。但是,结果应保存到内存缓冲区(要发送到 API(,而不是保存到文件中。在Python中处理这个问题的方法是使用io.BytesIO()对象。

综上所述,问题的解决方案是

import io
import numpy as np
import matplotlib.pyplot as plt
buf = io.BytesIO()
plt.imsave(buf, image_np, format='png')
image_data = buf.getvalue()
var_0 = requests.post(api_url, params=params, headers=headers, data=image_data)

其中image_np是作为numpy数组的图像。

另请注意,行image_data = buf.getvalue()不是必需的。相反,缓冲区内容可以直接在 API 调用中使用。

解决此问题的一种方法是使用 OpenCV 库,也许它对某些人来说非常有用,因为在处理图像时,使用 OpenCV 是很常见的。这是我的解决方案:

import cv2, requests
import numpy as np
numpy_image = cv2.imread("/path/to/image.png")
api_url = "your_api_url"
_ , encoded_image = cv2.imencode('.jpg', numpy_image)
response = requests.post(api_url, data = encoded_image.tobytes()).json()

最新更新