Преобразование ответа на запрос Python get (содержимое jpg) в массив Numpy

#arrays #python-3.x #numpy #python-requests #python-imageio

#массивы #python-3.x #numpy #python-запросы #python-imageio

Вопрос:

Рабочий процесс моей функции следующий:

  • извлечение jpg с помощью запроса python get
  • сохраните изображение в формате png (даже если оно загружено в формате jpg) на диске
  • используйте imageio для чтения с образа диска и преобразования его в массив numpy
  • работа с массивом

Это то, что я делаю, чтобы сохранить:

 response = requests.get(urlstring, params=params)
      if response.status_code == 200:
            with open('PATH%d.png' % imagenumber, 'wb') as output:
                output.write(response.content)
  

Это то, что я делаю для загрузки и преобразования png в np.array

 imagearray = im.imread('PATH%d.png' % imagenumber)
  

Поскольку мне не нужно постоянно хранить то, что я загружаю, я попытался изменить свою функцию, чтобы напрямую преобразовать response.content в массив Numpy. К сожалению, каждая библиотека, подобная imageio, работает одинаково, считывая uri с диска и преобразуя его в np.array.

Я пробовал это, но, очевидно, это не сработало, поскольку для ввода требуется uri

 response = requests.get(urlstring, params=params)
imagearray = im.imread(response.content))
  

Есть ли какой-либо способ преодолеть эту проблему? Как я могу преобразовать свой response.content в np.array?

Комментарии:

1. Сохранение его в формате .png не делает его файлом PNG…

2. @Benjamin Я знаю, но на самом деле проблема не в этом. Я просто следовал инструкциям API, который я использую для загрузки изображений; они используют формат png для загрузки, хотя они отправляют jpg для изображения, которое мне конкретно нужно.

Ответ №1:

imageio.imread способен считывать URL-адреса:

 import imageio

url = "https://example_url.com/image.jpg"

# image is going to be type <class 'imageio.core.util.Image'>
# that's just an extension of np.ndarray with a meta attribute

image = imageio.imread(url)
  

Дополнительную информацию вы можете найти в документации, там также есть примеры: https://imageio.readthedocs.io/en/stable/examples.html

Комментарии:

1. Это должно сработать, но на самом деле это не так, я также попробовал пример на их веб-странице: im = imageio.imread(‘ upload.wikimedia.org/wikipedia/commons/d/de /… ) Отображается ошибка, указывающая на то, что поиск обратной трассировки связан с ssl-сертификатом; Я попробовал обе формулы ‘http’ и ‘https’ с тем же результатом ошибки.

2. У меня этот пример работает. Вероятно, вам следует проверить конфигурацию вашей среды и подключение к Интернету, чтобы увидеть, в чем проблема.

3. Я обнаружил проблему, в Python 3.6 на macOS X необходимо установить ssl-сертификаты из пакета, указанного в установщике Python. Как только я это сделал, все заработало нормально. Мне нужно было только добавить эту часть внутри вызова, чтобы заставить его работать: imagearray = im.imread(im.core.urlopen(url).read(), ‘.jpg’) Возможно, вы сможете добавить это в свой post, на случай, если кому-либо понадобится такое же решение.

Ответ №2:

Вы можете использовать BytesIO как file, чтобы пропустить запись в реальный файл.

 bites = BytesIO(base64.b64decode(response.content))
  

Теперь он у вас есть как BytesIO , так что вы можете использовать его просто как файл:

 img = Image.open(bites)
img_np = np.array(im)
  

Комментарии:

1. Я получил ошибку при открытии функции: Ошибка операционной системы: не удается идентифицировать файл изображения <объект _io.BytesIO в 0x10faf3e08> У вас есть какие-либо идеи о?