如何从Python cv2,scikit image和mahotas中读取Internet URL中的图像?

pos*_*res 22 python opencv image-processing scikit-image mahotas

如何从Python cv2中的Internet URL读取图像?

这个Stack Overflow答案,

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())
Run Code Online (Sandbox Code Playgroud)

不好,因为Python向我报告:

TypeError: object.__new__(cStringIO.StringI) is not safe, use cStringIO.StringI.__new__
Run Code Online (Sandbox Code Playgroud)

ber*_*rak 25

由于cv2图像不是字符串(保存Unicode,yucc),而是NumPy数组, - 使用cv2和NumPy来实现它:

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()
Run Code Online (Sandbox Code Playgroud)

  • 在Python 3中,“urllib.urlopen”不起作用,表示“urllib没有名为urlopen的方法”。它应该是“urllib.request.urlopen()”。 (10认同)
  • 好的,它可以工作,但在那之后,我还使用 scikit 图像库: imgbnbin = mh.morph.dilate(gray, disk7) ,我得到: ValueError: morph.get_structuring_elem: Bc 没有正确的维度数。使用本地图像我没有收到此错误,为什么现在呢? (2认同)
  • 它是一个三维阵列,因为颜色通道.如果你想要它2d(灰度),请执行:cv2.imdecode(arr,0)#load as asycale (2认同)

Ton*_* Yu 22

以下将图像直接读入NumPy数组:

from skimage import io

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


Kel*_*ang 15

在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
Run Code Online (Sandbox Code Playgroud)

这是 imutils 中 url_to_image 的实现,所以你可以调用

import imutils
imutils.url_to_image(url)
Run Code Online (Sandbox Code Playgroud)