【python】OpenCV—Open URL Images

文章目录

1、需求描述

给出一个 url 链接,显示该链接对应的图片

2、方法一,numpy+urlopen

python 复制代码
# 导入包
import numpy as np
import cv2
import ssl
import sys

ssl._create_default_https_context = ssl._create_unverified_context  # 解决SSL 证书的验证问题
# 如果是Python2
if sys.version_info.major == 2:
    from urllib import urlopen
# 如果是Python3
elif sys.version_info.major == 3:
    from urllib.request import urlopen


# 方法1:OpenCV、NumPy 和 urllib

def url_to_image(url):
    # 下载图像,将其转换为NumPy数组,然后将其读入OpenCV格式
    resp = urlopen(url)
    image = np.asarray(bytearray(resp.read()), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
    # 返回图片
    return image


# 初始化要下载的图像 URL 列表
urls = [
    "https://pyimagesearch.com/wp-content/uploads/2015/01/opencv_logo.png",
    "https://pyimagesearch.com/wp-content/uploads/2015/01/google_logo.png",
	"https://image.9game.cn/2020/7/9/169171359.jpg",
]

# 遍历图像 URL
for url in urls:
    # 下载图片网址并显示
    print("downloading %s" % (url))
    image = url_to_image(url)
    cv2.imshow("Image", image)
    cv2.waitKey(0)

会先下载图片,再进行显示

python 复制代码
downloading https://pyimagesearch.com/wp-content/uploads/2015/01/opencv_logo.png
downloading https://pyimagesearch.com/wp-content/uploads/2015/01/google_logo.png
downloading https://image.9game.cn/2020/7/9/169171359.jpg


3、方法二,scikit-learn

python 复制代码
# 导入包
from skimage import io
import cv2

# 初始化要下载的图像 URL 列表
urls = [
    "https://image.9game.cn/2020/7/9/169171359.jpg",
]


# 方法2:scikit-image

for url in urls:
    # 使用 scikit-image 下载图像
    print("downloading %s" % (url))
    image = io.imread(url)
    cv2.imshow("Incorrect", image)
    cv2.imshow("Correct", cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    cv2.waitKey(0)

4、涉及到的库

urllib.request.urlopen

是Python标准库中urllib.request模块的一个非常实用的函数,用于打开一个URL(统一资源定位符),并返回一个类似文件的对象。这个对象提供了许多方法来处理URL响应,比如读取响应的内容、获取响应头信息等。

下面是一个使用urllib.request.urlopen的基本示例:

python 复制代码
import urllib.request  
  
# 定义一个URL  
url = 'http://example.com'  
  
# 使用urlopen打开URL  
with urllib.request.urlopen(url) as response:  
    # 读取所有内容  
    html = response.read()  
    # 如果你想看到HTML内容,可以解码并打印  
    print(html.decode('utf-8'))  
  
    # 你也可以获取其他信息,比如状态码  
    print(response.status)  
    # 获取响应头  
    print(response.getheaders())

注意几个关键点:

  • 使用with语句:urlopen返回的对象是一个上下文管理器(context manager),这意味着你可以使用with语句来自动处理资源的打开和关闭。这是处理文件和网络请求时推荐的做法,因为它可以保证即使在发生异常时也能正确地关闭资源。
  • 读取响应内容:通过调用.read()方法,你可以读取响应体的全部内容。注意,这将作为字节对象返回,因此你可能需要将其解码为字符串(如上例所示,使用.decode('utf-8'))。
  • 处理异常:在实际应用中,处理网络请求时可能会遇到各种异常,如urllib.error.HTTPError(HTTP错误)和urllib.error.URLError(URL错误)。你应该使用try...except块来捕获这些异常,并适当地处理它们。
  • 请求头:有时你可能需要自定义请求头,比如设置用户代理或发送Cookie。这可以通过创建一个urllib.request.Request对象并将其传递给urlopen来实现。
python 复制代码
import urllib.request  
  
url = 'http://example.com'  
headers = {'User-Agent': 'Mozilla/5.0'}  
  
request = urllib.request.Request(url, headers=headers)  
with urllib.request.urlopen(request) as response:  
    # ... 处理响应 ...
通过这种方式,你可以更灵活地控制你的网络请求。

skimage.io.imread

skimage.io.imread 是 Scikit-image 库中用于读取图像文件的一个函数。Scikit-image 是一个用于图像处理的Python库,它提供了大量的图像处理算法和工具,非常适合进行科学研究。imread 函数是其中非常基础且常用的一个函数,它能够从给定的文件路径读取图像,并将其作为 NumPy 数组返回。

以下是使用 skimage.io.imread 的一个简单示例:

python 复制代码
python
from skimage import io  
  
# 定义图像文件的路径  
image_path = 'path/to/your/image.jpg'  
  
# 使用 imread 读取图像  
image = io.imread(image_path)  
  
# 现在 image 是一个 NumPy 数组,你可以使用它进行图像处理  
# 例如,打印图像的形状(高度、宽度、通道数)  
print(image.shape)  
  
# 如果你正在使用 Jupyter Notebook 或其他支持图像显示的IDE,  
# 你可以使用 matplotlib 或其他库来显示图像  
import matplotlib.pyplot as plt  
  
plt.imshow(image)  
plt.axis('off')  # 不显示坐标轴  
plt.show()

在这个示例中,image_path 应该替换为你想要读取的图像文件的实际路径。io.imread(image_path) 会读取该图像文件,并将其作为一个 NumPy 数组 image 返回。这个数组通常有三个维度,分别对应于图像的高度、宽度和颜色通道数(对于彩色图像,通常是 RGB 三个通道)。

skimage.io.imread 支持多种图像格式,包括但不限于 JPEG、PNG、TIFF 等。它会自动根据文件内容推断图像的格式,并相应地读取图像数据。

需要注意的是,从 Scikit-image 0.18 版本开始,skimage.io 模块中的函数(包括 imread)已经被标记为弃用(deprecated),并在未来的版本中可能会被移除。作为替代,Scikit-image 推荐使用 imageio.imread 函数来读取图像,imageio 是一个独立的库,提供了与 skimage.io 类似的功能,并且更加灵活和强大。然而,在当前的许多项目中,skimage.io.imread 仍然被广泛使用,并且如果你正在使用 Scikit-image 的其他图像处理功能,那么继续使用 skimage.io.imread 可能是一个方便的选择。不过,对于新项目或寻找更长期支持的项目,考虑使用 imageio.imread 可能是一个好主意。

5、参考文章

参考学习来自:imutils基础(6)使用 Python 和 OpenCV 将 URL 转换为图像

相关推荐
Chef_Chen5 分钟前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
百事老饼干9 分钟前
Java[面试题]-真实面试
java·开发语言·面试
千澜空24 分钟前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
可均可可31 分钟前
C++之OpenCV入门到提高004:Mat 对象的使用
c++·opencv·mat·imread·imwrite
斯凯利.瑞恩32 分钟前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
杨荧1 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
白子寰1 小时前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
yannan201903131 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁1 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev1 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理