#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> У вас есть какие-либо идеи о?