Как я могу прочитать изображение с URL-адреса в Интернете в Python cv2, scikit image и mahotas?

Как я могу прочитать изображение с URL-адреса в Интернете в Python cv2?

Этот ответ на переполнение стека,

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())

это не хорошо, потому что Python сообщил мне:

TypeError: object.__new__(cStringIO.StringI) is not safe, use cStringIO.StringI.__new__

person postgres    schedule 11.01.2014    source источник


Ответы (4)


Поскольку изображение 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()
person berak    schedule 11.01.2014
comment
хорошо, это работает, но после этого я также использую библиотеку изображений scikit: imgbnbin = mh.morph.dilate(gray, disk7) и получаю: ValueError: morph.get_structuring_elem: Bc не имеет правильного количества измерений. Используя локальные изображения, я не получаю эту ошибку, почему сейчас? - person postgres; 11.01.2014
comment
Используя локальное изображение, мой скрипт отлично работает как с библиотеками изображений cv2, так и с библиотеками scikit. Используя изображения URL и код выше, мой скрипт блокируется, когда я начинаю работать с изображением scikit: imgbnbin = mh.morph.dilate(grey, disk7) с помощью ValueError. Я добавляю только ваш код и использую изображение URL-адреса, поэтому я не понимаю ошибку значения. может быть, изображение URL-адреса обрабатывается по-другому, что scikit не понимает? - person postgres; 11.01.2014
comment
ой, извини. понимаю вашу проблему, но понятия не имею. - person berak; 11.01.2014
comment
может быть, я думаю, что версия URL-адреса сгенерирует массив 3D numpy, и мне нужен массив 2D numpy! - person postgres; 13.01.2014
comment
это трехмерный массив из-за цветовых каналов. если вы хотите 2d (оттенки серого), выполните: cv2.imdecode (arr, 0) # загрузите как оттенки серого - person berak; 13.01.2014
comment
В Python 3 urllib.urlopen не работает, говорит, что urllib has no method named urlopen. Должно быть urllib.request.urlopen(). - person Puspam; 12.07.2020

Следующее считывает изображение непосредственно в массив NumPy:

from skimage import io

image = io.imread('https://raw2.github.com/scikit-image/scikit-image.github.com/master/_static/img/logo.png')
person Tony S Yu    schedule 11.01.2014

в питоне3:

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

это реализация url_to_image в imutils, поэтому вы можете просто позвонить

import imutils
imutils.url_to_image(url)
person Kelvin Wang    schedule 06.03.2019
comment
readFlag=cv2.IMREAD_COLOR необходим при попытке сравнить удаленное и локальное изображения, которые были одинаковыми. С -1 формы изображений были другими. Большое спасибо! - person LaintalAy; 14.11.2019

Если вы используете запросы, вы можете использовать это

import requests
import numpy as np
from io import BytesIO
from PIL import Image

def url_to_img(url, save_as=''):
  img = Image.open(BytesIO(requests.get(url).content))
  if save_as:
    img.save(save_as)
  return np.array(img)

img = url_to_img('https://xxxxxxxxxxxxxxxxxx')
img = url_to_img('https://xxxxxxxxxxxxxxxxxx', 'sample.jpg')

cv2.imshow(img)
person rish_hyun    schedule 06.05.2021