文章目录
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
可能是一个好主意。