Читать несколько изображений из одного каталога с imageio

У меня есть каталог test/ с изображениями 0.jpg, а также 1.jpg, Как я могу использовать imageio "s mimread функция для указания каталога test и читать бот 0 а также 1? Или это не то, для чего он предназначен?

Я старался imageio.mimread(uri="/path/to/test/", format=".jpg") но получил следующее:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-43-89a6d166a345> in <module>()
----> 1 imageio.mimread(uri="test", format=".jpg", memtest=True)

/Users/myuser/anaconda/envs/python3/lib/python3.5/site-packages/imageio/core/functions.py in mimread(uri, format, memtest, **kwargs)
    279 
    280     # Get reader
--> 281     reader = read(uri, format, 'I', **kwargs)
    282 
    283     # Read

/Users/myuser/anaconda/envs/python3/lib/python3.5/site-packages/imageio/core/functions.py in get_reader(uri, format, mode, **kwargs)
    127 
    128     # Return its reader object
--> 129     return format.get_reader(request)
    130 
    131 

/Users/myuser/anaconda/envs/python3/lib/python3.5/site-packages/imageio/core/format.py in get_reader(self, request)
    165         if select_mode not in self.modes:
    166             raise RuntimeError('Format %s cannot read in mode %r' % 
--> 167                                (self.name, select_mode))
    168         return self.Reader(self, request)
    169 

RuntimeError: Format JPEG-PIL cannot read in mode 'I'

3 ответа

Я просмотрел исходный код для imageio и не вижу никакой поддержки в mimread() для перебора файлов в папке для чтения нескольких изображений. Я рекомендую вместо этого использовать scikit-изображение. Вот пример:

from skimage.io import imread_collection
seq = imread_collection("*.jpg", conserve_memory=True)

Затем вы можете индексировать в seq, чтобы получить каждое изображение:

seq[0]

seq[1]

и т.п.

В документации сказано:

uri: {str, pathlib.Path, байты, файл}>

Ресурс для загрузки изображений, например, имя файла, pathlib.Path, адрес http или объект файла, см. Документацию для получения дополнительной информации.

Пытаться imageio.mimread(uri='test'),

Или это не для этого?

Верный. предназначен для форматов изображений, которые могут хранить более одного изображения в одном файле. Полу-популярным примером такого формата является .tiff, который имеет понятие страниц, которые могут содержать разные изображения. Еще один .psd (формат фотошопа).

Если вы хотите читать изображения из папки, вы можете сделать это традиционным способом, используя выражение генератора (при условии, что ваша папка содержит только изображения, которые вы хотите прочитать.

      (iio.imread(filename) for filename in glob.glob(folder))

или вы можете быть более сложными и написать что-то, что рекурсивно читает и / или фильтрует файлы в зависимости от ваших потребностей.

      def read_folder(folder, ...):
    for item in glob.glob(folder):
        if matches_image_filter(item):
            yield iio.imread(item)
        elif matches_subfolder_filter(item):
            yield from read_folder(item, ...)

Вы уловили идею;)


Примечание. Я слышу это не впервые. mimread сбивает с толку, поэтому, если у вас есть предложения по улучшению ясности, не стесняйтесь оставлять комментарии, и я буду рад обновить документы.

Другие вопросы по тегам