如何通过URL打开图片(Python)

作者: 冰不语 | 来源:发表于2017-05-08 11:31 被阅读346次

    不论是用opencv还是PIL,skimage等库,在之前做图像处理的时候,几乎都是读取本地的图片。最近尝试爬虫爬取图片,在保存之前,我希望能先快速浏览一遍图片,然后有选择性的保存。这里就需要从url读取图片了。查了很多资料,发现有这么几种方法,这里做个记录。

    本文用到的图片URL如下:

    img_src = 'http://wx2.sinaimg.cn/mw690/ac38503ely1fesz8m0ov6j20qo140dix.jpg'
    

    1.用OpenCV

    OpenCV的imread()只能加载本地的图片,并不能通过网址加载图片。但是,opencv的VideoCapture类可以从url加载视频。如果只用opencv的话,我们可以一个迂回的方式:先用VideoCapure加载网址下的图片,然后再传给Mat。

    import cv2
    cap = cv2.VideoCapture(img_src)
    if( cap.isOpened() ) :
        ret,img = cap.read()
        cv2.imshow("image",img)
        cv2.waitKey()
    

    2. OpenCV+Numpy+urllib

    import numpy as np
    import urllib
    import cv2
    resp = urllib.urlopen(img_src)
    image = np.asarray(bytearray(resp.read()), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
    cv2.imshow("Image", image)
    cv2.waitKey(0)
    

    urlopen返回 一个类文件对象,它提供了如下方法:
    read() , readline() , readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样。然后把返回的类文件对象重新编码,转换为图片传给Mat。

    3.PIL+requests

    import requests as req
    from PIL import Image
    from io import BytesIO
    response = req.get(img_src)
    image = Image.open(BytesIO(response.content))
    image.show()
    

    requests能以字节的方式访问请求响应体,以上就是以请求返回的二进制数据创建一张图片的代码。

    4. skimage

    from skimage import io
    image = io.imread(img_src)
    io.imshow(image)
    io.show()
    

    相对来说,这种方式应该是最简单的,因为skimage可以直接以imread()函数来读取网页图片,而不需要其他的辅助,也不需要迂回。


    公众号CVPy,分享OpenCV和Python的实战内容。每一篇都会放出完整的代码。欢迎关注。
    

    相关文章

      网友评论

        本文标题:如何通过URL打开图片(Python)

        本文链接:https://www.haomeiwen.com/subject/iysmtxtx.html