Bootstrap

【python】OpenCV—Open URL Images

在这里插入图片描述

1、需求描述

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

2、方法一,numpy+urlopen

# 导入包
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)

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

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

# 导入包
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的基本示例:

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来实现。
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
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 转换为图像

;