【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 转换为图像

相关推荐
Swift社区1 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht1 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht1 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20241 小时前
Swift 数组
开发语言
stm 学习ing2 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc3 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe4 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin4 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python