首页 > 编程问答 >如何在python中通过requests和opencv加载uint16 png文件

如何在python中通过requests和opencv加载uint16 png文件

时间:2024-08-02 16:57:11浏览次数:18  
标签:python numpy image opencv python-requests

我正在尝试从 URL 自动加载图像,然后将其加载到 numpy 矩阵。为此,我需要使用 requests 和 opencv 库。对于像 uint8 这样编码的标准图像,它以正确的方式工作,并且由于值溢出而损坏了 uint16 图像。这是我现在正在使用的一个简单的最小代码:

import requests
import cv2
import numpy as np
import sys

r = requests.get(sys.argv[1])
img_bin = r.content
image_data = np.asarray(bytearray(img_bin), dtype="uint8")
image = cv2.imdecode(image_data, cv2.IMREAD_UNCHANGED)
# image.dtype -> np.uint8

从本地驱动器加载 uint16 图像工作正常:

import cv2
import sys

png_u16_filepath = sys.argv[1]
png_u8_filepath = sys.argv2[]
image = cv2.imread(png_u16_filepath, cv2.IMREAD_UNCHANGED)
#image.dtype -> np.uint16
image = cv2.imread(png_u8_filepath, cv2.IMREAD_UNCHANGED)
#image.dtype -> np.uint8

但是,我需要从互联网加载图像,然后从内存加载图像,我无法编写它们本地到图像文件。

  1. 是否可以从requests.img_bin或任何其他方式知道图像文件是uint8还是uint16? URL 后面的图像可以是 uint8 或 uint16 图像。
  2. 我也尝试 np.asarray(bytearray(img_bin), dtype="uint16") 但它会导致错误: ValueError: 缓冲区大小必须是元素大小的倍数 有没有办法通过 opencv lib 将 img_bin 转换为正确的 np.uint16 numpy 图像?

以下图像发生问题 https://images.ximilar.com/examples/fail/png16.png


在加载 uint16 PNG 图像时遇到的问题是,试图将字节流直接解释为 numpy 数组,而没有考虑 PNG 文件结构中的位深度信息。

以下是如何使用 requests opencv 加载 uint8 和 uint16 PNG 图像的解决方案:

import requests
import cv2
import numpy as np
import io

def load_image_from_url(url):
  """从 URL 加载图像并将其解码为合适的 numpy 数组。"""
  r = requests.get(url)
  r.raise_for_status()  # 检查请求是否成功

  # 使用 BytesIO 将字节流包装为文件对象
  image_file = io.BytesIO(r.content)

  # 使用 imdecode 加载图像,自动检测位深度
  image = cv2.imdecode(np.frombuffer(image_file.read(), np.uint8), cv2.IMREAD_UNCHANGED)
  return image

# 示例用法:
image_url = "https://images.ximilar.com/examples/fail/png16.png"  # 或任何其他 PNG 图像 URL
image = load_image_from_url(image_url)

# 打印图像数据类型以验证
print(image.dtype)

代码说明:

  1. load_image_from_url(url) 函数:
  2. 它使用 requests.get() 获取给定 URL 的图像数据。
  3. r.raise_for_status() 确保请求成功,否则引发异常。
  4. io.BytesIO(r.content) 将字节流 ( r.content ) 包装为文件对象,以便 cv2.imdecode 可以读取它。
  5. np.frombuffer(image_file.read(), np.uint8) 将字节数据解释为无符号 8 位整数数组。
  6. cv2.imdecode(..., cv2.IMREAD_UNCHANGED) 解码图像数据,保留其原始位深度(uint8 或 uint16)。

  7. 示例用法:

  8. 提供要加载的图像的 URL。
  9. 调用 load_image_from_url() 函数来获取解码后的图像数组。
  10. 打印 image.dtype 以验证图像是否已加载为正确的位深度。

关键点:

  • 使用 cv2.imdecode() cv2.IMREAD_UNCHANGED 标志可以让 OpenCV 自动检测和处理 uint8 和 uint16 PNG 图像,而无需手动检查位深度。
  • io.BytesIO 允许将字节流视为文件对象,这对于与 cv2.imdecode() 等函数一起使用至关重要。

使用此方法,应该能够从 URL 加载 uint8 和 uint16 PNG 图像,而不会遇到任何数据溢出问题。

标签:python,numpy,image,opencv,python-requests
From: 78822177

相关文章

  • Selenium + Python 自动化测试01(准备篇)
        本篇文章主要讲述Selenium+Python自动化测试-准备篇。主要时相关软件介绍,下载,安卓等。一、Selenium简介    1、Selenium是什么?        官网描述:        Primarily,itisforautomatingwebapplicationsfortestingpurposes,......
  • 如何使用 Python 在 2D 曲面上切割 3D 体积?
    考虑3D中的闭合表面网格(mesh1),由两个合并块组成,如图所示。两个合并块,具有不同颜色的细分补丁。网格以STL文件形式给出,并被细分分成不同的补丁。每个面片都在STL文件中保存为单独的实体。此外,我有一个由STL文件给出的弯曲2D表面网格(......
  • Python教程(十):面向对象编程(OOP)
    目录专栏列表前言一、面向对象编程概述1.1类和对象1.2继承1.3多态1.4封装二、Python中的类和对象2.1定义类2.2`__init__`函数解释2.3创建对象三、继承3.1基本继承3.2创建子类对象四、多态五、封装六.访问限制七、综合实例结语专栏列表Python教程(一):环......
  • centos7 解决docker 拉取镜像错误 error pulling image configuration: download fai
    为什么会出现i/otimeout错误?i/otimeout错误主要是由于网络连接不稳定或者服务器响应慢导致的。当Docker尝试从镜像仓库拉取镜像时,如果在规定时间内没有得到响应,就会出现i/otimeout错误。“错误的根源在于网络连接和镜像仓库的响应速度” 解决方案:换源为了解决这个......
  • Qt C++ 调用 Python 之 PyObject* 数据类型转换
    整数:PyLong_FromLong和PyLong_AsLong类型检查函数:PyLong_Check()intcppInt=42;//C++整数转换为Python整数对象PyObject*pyInt=PyLong_FromLong(cppInt);//Python整数对象转换为C++整数longcppIntFromPy=PyLong_AsLong(pyInt);Py_DECREF(pyInt)......
  • Python 警告:重试(重试(总计=4,连接=无,读取=无,重定向=无,状态=无))
    我正在尝试pipinstall--upgradepip并保持收到此错误:WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby'ProxyError('Cannotconnecttoproxy.',NewConnectionError('<......
  • {Python} 有没有办法从函数中“提取”返回值变量并在其他地方使用它,而不调用原始函数?
    第一次在这里发帖。对python来说相对较新,我正在开发一个程序,它基本上是一个随机故事生成器,用于学习语言、发展技能并添加到我的投资组合中。我有一个主文件(最初启动该程序)、一个简介文件(对于介绍部分,获取用户名以及我试图“提取”user_name变量的位置),一个函数文件,其中包......
  • 为什么我在 Python 中的 Skip-Gram 实现会产生不正确的结果?
    我正在使用Python实现Word2Vec的Skip-Gram模型。然而,正如生成的嵌入及其可视化所示,我的模型似乎无法正常工作。这是嵌入的3D图的示例,它显示单词聚集在一起并重叠,因此很难区分它们:我怀疑问题在于我的实现而不是绘图函数。importnumpyasnpfromnltk.corpusimpor......
  • 基于SpringBoot的智能购房推荐系统-09040(免费领源码)可做计算机毕业设计JAVA、PHP、爬
    Springboot智能购房推荐系统摘 要近年来随着我国经济的高速发展,房地产业也随之蓬勃发展,尤其是最近国家新出台的房改政策。鼓励居民购房,这对房产公司无疑是一个极好的发展势头。尤为重要的是,近几年随着信息技术和电子商务的快速发展,许多企业都开发了自己房产信息软件。智......
  • Python 基础教学 - 开发规范
    Python基础教学-开发规范一、引言在Python编程中,遵循良好的开发规范是编写高质量、可维护代码的关键。本文将为您详细介绍Python开发中的一些重要规范,帮助您养成良好的编程习惯。二、代码布局缩进使用4个空格进行缩进,避免使用制表符。示例:ifTrue:p......