如何使用 PIL 对 numpy 数组进行编码,例如 opencv 的 cv2.imencode()?

Posted

技术标签:

【中文标题】如何使用 PIL 对 numpy 数组进行编码,例如 opencv 的 cv2.imencode()?【英文标题】:How to encode a numpy array with PIL, like opencv's cv2.imencode()? 【发布时间】:2022-01-13 14:31:03 【问题描述】:

我正在用烧瓶制作一个 REST API,我想将图像发送到我的服务器。到目前为止,我做到了-

from PIL import Image, ImageOps
import cv2

image= Image.open("image.jpg")
size = (224, 224)
image = ImageOps.fit(image, size, Image.ANTIALIAS)
image= np.array(image)

_, JPEG = cv2.imencode('.jpg', image)

response_raw = requests.post(test_url, data=JPEG.tostring(), headers=headers)

现在它工作得非常好,但不幸的是我在我的最终项目中使用了 OPENCV。所以我用 PIL 进行了测试,试图复制 cv2.imencode() 方法,但它没有用。我这样做了,替换了cv2.imencode 方法(并删除了image=np.array(image)-

buffer = BytesIO()
image.save(buffer, format="JPEG")

JPEG = buffer.getvalue()

这不起作用,因为type(JPEG) 返回<class 'bytes'>,而工作代码(带有cv2.imencode("jpg", img))返回<class 'numpy.ndarray'>

如何对 numpy 数组进行编码处理?

【问题讨论】:

试试,JPEG = np.array(buffer.getvalue()),你得到了什么? 我很困惑你为什么会感到困惑。 bytes 对象包含字节。一个 uint8 类型的 numpy 数组(你有...)也包含字节。 好吧,我只是对整个事情感到非常困惑。 np.array(buffer.get_value()) 似乎有效。谢谢!对不起! 【参考方案1】:

JPEG = np.array(buffer.getvalue()) 似乎有效

【讨论】:

以上是关于如何使用 PIL 对 numpy 数组进行编码,例如 opencv 的 cv2.imencode()?的主要内容,如果未能解决你的问题,请参考以下文章

PIL 图像到数组(numpy 数组到数组) - Python

重新采样表示图像的 numpy 数组

如何将 NumPy 数组转换为应用 matplotlib 颜色图的 PIL 图像

PIL打开图像的numpy数组中的元素数量错误

Python - 尝试使用 PIL 的 Image.fromarray 保存 numpy 数组时出现 TypeError

将 NumPy 数组转换为 PIL 图像