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)
Author by
postgres
Updated on July 09, 2022Comments
-
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 over 10 yearsok 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 over 10 yearsUsing 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 over 10 yearsoh, sorry. understand your problem, but no idea.
-
postgres over 10 yearsmaybe, i think by "url version" generate a 3d numpy array and i need a 2D numpy array!
-
berak over 10 yearsit's a 3d array becaus of the color channels. if you want it 2d(grayscale), do : cv2.imdecode(arr,0) # load as grayscale
-
LaintalAy over 4 yearsreadFlag=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 almost 4 yearsIn Python 3, the
urllib.urlopen
does not work, says thaturllib has no method named urlopen
. It should beurllib.request.urlopen()
. -
Sabzaliev Shukur about 2 yearsif you want 3D array, change
img
to thisimg = cv2.imdecode(arr, cv2.IMREAD_COLOR)
-
sanster9292 about 2 yearsFor Python3 you would need to open URL as such import urllib.request req = urllib.request.urlopen(url)