Scikit-image

Теги: ml 

Scikit-image работает с [numpy] array

>>> from skimage import data
>>> camera = data.camera()
>>> type(camera)
<type 'numpy.ndarray'>
>>> # An image with 512 rows and 512 columns
>>> camera.shape
(512, 512)

Модуль data содержить несколько тестовых наборов данных

Импорт своих изображений

>>> import os
>>> filename = os.path.join(skimage.data_dir, 'moon.png')
>>> from skimage import io
>>> moon = io.imread(filename)

Отдельный пакет natsort позволяет предварительно отсортировать список натуральным образом (не лексикографически) перед импортом

>>> import os
>>> from natsort import natsorted, ns
>>> from skimage import io
>>> list_files = os.listdir('.')
>>> list_files
['01.png', '010.png', '0101.png', '0190.png', '02.png']
>>> list_files = natsorted(list_files)
>>> list_files
['01.png', '02.png', '010.png', '0101.png', '0190.png']
>>> image_list = []
>>> for filename in list_files:
...   image_list.append(io.imread(filename))

[numpy] for images

>>> from skimage import data
>>> camera = data.camera()
>>> type(camera)
<type 'numpy.ndarray'>

>>> camera.shape
(512, 512)
>>> camera.size
262144

>>> camera.min(), camera.max()
(0, 255)
>>> camera.mean()
118.31400299072266

Каналы для цветных изображений

>>> cat = data.chelsea()
>>> type(cat)
<type 'numpy.ndarray'>
>>> cat.shape
(300, 451, 3)

>>> cat[10, 20]
array([151, 129, 115], dtype=uint8)
>>> # Set the pixel at (50th row, 60th column) to "black"
>>> cat[50, 60] = 0
>>> # set the pixel at (50th row, 61st column) to "green"
>>> cat[50, 61] = [0, 255, 0]  # [red, green, blue]

Больше деталей

Image data types

Изображение - это всего лишь массив numpy с одним из следующих типов:

Data typeRange
uint8 0 to 255
uint16 0 to 65535
uint32 0 to 232 - 1
float -1 to 1 or 0 to 1
int8 -128 to 127
int16 -32768 to 32767
int32 -231 to 231 - 1

Функции могут поддерживать только подмножество определенных типов данных. В таком случае ввод будет преобразован в требуемый тип (если это возможно), и в лог будет напечатано предупреждающее сообщение, если потребуется копия в памяти. Доступны следующие служебные функции в основном пакете:

Function name Description
img_as_float Convert to floating point (integer types become 64-bit floats)
img_as_ubyte Convert to 8-bit uint.
img_as_uint Convert to 16-bit uint.
img_as_int Convert to 16-bit int.
>>> from skimage.util import img_as_ubyte
>>> image = np.array([0, 0.5, 1], dtype=float)
>>> img_as_ubyte(image)
array([  0, 128, 255], dtype=uint8)

Конвертация может приводить к потере точности! Кроме того, некоторые функции имеют собственные ограничению по ренжу.

Кроме того, можно использовать данные из [open-cv] с минимальными затратами на конвертацию. Подробнее

I/O Plugin Infrastructure

Handling Video Files

В исследовательских целях удобнее преобразовать файлы видео в последовательности изображений или многомерный TIF. Для одноразового решения самый простой и надежный способ — преобразовать видео в набор последовательно пронумерованных файлов изображений, часто называемый последовательностью изображений. Затем это можно читать так. Пример преобразования (из каждого кадра видео делается изображение, которое нумеруется пятью цифрами с добавлением нуля слева):

ffmpeg -i "video.mov" -f image2 "video-frame%05d.png"

Создание последовательности изображений имеет недостатки: они могут быть большими и громоздкими, а их создание может занять некоторое время. Как правило, предпочтительнее работать непосредственно с исходным видеофайлом. Для этого подойдет пакет PyAV

import av
v = av.open('path/to/video.mov')

for packet in container.demux():
    for frame in packet.decode():
        if frame.type == 'video':
            img = frame.to_image()  # PIL/Pillow image
            arr = np.asarray(img)  # numpy array
            # Do something!

С помощью пакета pilms, написанного поверх PyAV, можно получяить доп.функциональность и работать с разными форматами, используя общий АПИ.

import pims
v = pims.Video('path/to/video.mov')
v[-1]  # a 2D numpy array representing the last frame

Moviepy позволяет изменять небольшие видео. Imageio поддерживает большее число форматов.

Наконец, можно использовать [open-cv]

Image adjustment: transforming image content

Geometrical transformations of images

Полезные ресурсы

Смотри еще: