How can I read an image from an Internet URL in Python cv2, scikit image and mahotas?

49,129

Solution 1

Since a cv2 image is not a string (save a Unicode one, yucc), but a NumPy array, - use cv2 and NumPy to achieve it:

import cv2
import urllib
import numpy as np

req = urllib.urlopen('http://answers.opencv.org/upfiles/logo_2.png')
arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
img = cv2.imdecode(arr, -1) # 'Load it as it is'

cv2.imshow('lalala', img)
if cv2.waitKey() & 0xff == 27: quit()

Solution 2

The following reads the image directly into a NumPy array:

from skimage import io

image = io.imread('https://raw2.github.com/scikit-image/scikit-image.github.com/master/_static/img/logo.png')

Solution 3

in python3:

from urllib.request import urlopen
def url_to_image(url, readFlag=cv2.IMREAD_COLOR):
    # download the image, convert it to a NumPy array, and then read
    # it into OpenCV format
    resp = urlopen(url)
    image = np.asarray(bytearray(resp.read()), dtype="uint8")
    image = cv2.imdecode(image, readFlag)

    # return the image
    return image

this is the implementation of url_to_image in imutils, so you can just call

import imutils
imutils.url_to_image(url)
Share:
49,129
postgres
Author by

postgres

Updated on July 09, 2022

Comments

  • postgres
    postgres almost 2 years

    How can I read an image from an Internet URL in Python cv2?

    This Stack Overflow answer,

    import cv2.cv as cv
    import urllib2
    from cStringIO import StringIO
    import PIL.Image as pil
    url="some_url"
    
    img_file = urllib2.urlopen(url)
    im = StringIO(img_file.read())
    

    is not good because Python reported to me:

    TypeError: object.__new__(cStringIO.StringI) is not safe, use cStringIO.StringI.__new__
    
  • postgres
    postgres over 10 years
    ok it works, but after that, i use also scikit image library: imgbnbin = mh.morph.dilate(gray, disk7) and i get: ValueError: morph.get_structuring_elem: Bc does not have the correct number of dimensions. Using local images i do not get this error, why now?
  • postgres
    postgres over 10 years
    Using a local image my script works fine both with cv2 and scikit image libraries. Using url images and the code above my script is blocked when i start to work with scikit image: imgbnbin = mh.morph.dilate(gray, disk7) by a ValueError. I add only your code and used a "url image", so i do not figure out the Value Error. maybe url image is treated in a different way that scikit does not undestand?
  • berak
    berak over 10 years
    oh, sorry. understand your problem, but no idea.
  • postgres
    postgres over 10 years
    maybe, i think by "url version" generate a 3d numpy array and i need a 2D numpy array!
  • berak
    berak over 10 years
    it's a 3d array becaus of the color channels. if you want it 2d(grayscale), do : cv2.imdecode(arr,0) # load as grayscale
  • LaintalAy
    LaintalAy over 4 years
    readFlag=cv2.IMREAD_COLOR is essential when trying to compare between a remote and a local images that were the same. With -1 shapes of images were different. Thanks a lot!
  • Puspam
    Puspam almost 4 years
    In Python 3, the urllib.urlopen does not work, says that urllib has no method named urlopen. It should be urllib.request.urlopen().
  • Sabzaliev Shukur
    Sabzaliev Shukur about 2 years
    if you want 3D array, change img to this img = cv2.imdecode(arr, cv2.IMREAD_COLOR)
  • sanster9292
    sanster9292 about 2 years
    For Python3 you would need to open URL as such import urllib.request req = urllib.request.urlopen(url)