Вы можете прочитать изображение в массиве numpy, используя библиотеку opencv. Массив содержит данные на уровне пикселей. И согласно требованию вы можете изменять данные изображения на уровне пикселей, обновляя значения массива.
Чтобы прочитать изображение в Python с помощью OpenCV, используйте функцию cv2.imread(). Она возвращает двухмерную или трехмерную матрицу в зависимости от количества цветовых каналов, присутствующих в изображении. Для двоичного изображения или изображения в градациях серого достаточно двухмерного массива. Но для цветного изображения нужен 3D-массив.
Мы узнаем, в каком порядке функция imread() декодирует цветовые каналы изображения, и как обрабатывает различные расширения изображения.
Синтаксис
Синтаксис функции приведен ниже.
cv2.imread(/path/to/image, flag)
Где, /path/to/image должен быть полным абсолютным путем к изображению. flag является необязательным, и для него можно передать одно из следующих возможных значений:
- IMREAD_COLOR считывает изображение с цветами RGB, но без канала прозрачности. Это значение по умолчанию для флага, когда в качестве второго аргумента для cv2.imread() не указано значение.
- IMREAD_GRAYSCALE считывает изображение, как серое. Если исходное изображение является цветным, значение серого каждого пикселя вычисляется путем взятия среднего значения цветовых каналов и считывается в массив.
- IMREAD_UNCHANGED считывает изображение, как есть из источника. Если исходное изображение является RGB, оно загружает изображение в массив с красным, зеленым и синим каналами. Если исходное изображение – ARGB, оно загружает изображение с тремя цветовыми компонентами вместе с альфа-каналом или каналом прозрачности.
Пример 1: чтение цветного изображения
В этом примере мы будем читать цветное изображение. Поскольку значение аргумента флага по умолчанию – cv2.IMREAD_COLOR, мы не передаем flag явно.
import cv2
#read image
img = cv2.imread('D:/image-1.png')
#print its shape
print('Image Dimensions :', img.shape)
Запустите указанную выше программу в Python, и вы получите следующий результат.
Image Dimensions : (400, 640, 3)
img.shape возвращает кортеж, представляющий (высоту, ширину, число каналов). Высота изображения 400 пикселей, ширина 640 пикселей, в изображении три цветовых канала. Для cv2.IMREAD_COLOR канал прозрачности игнорируется, даже если он присутствует.
Пример 2: считывание серого изображения
В этом примере мы будем читать изображение в градациях серого. На входе может быть цветное изображение в градациях серого. Но, если аргумент флага – IMREAD_GRAYSCALE, изображение в градациях серого.
import cv2
img = cv2.imread('D:/image-1.png', cv2.IMREAD_GRAYSCALE)
print('Image Dimensions :', img.shape)
Вывод:
Image Dimensions : (400, 640)
Высота изображения составляет 400 пикселей, ширина – 640. Каждый элемент в массиве представляет значение серой шкалы в соответствующем пикселе.
Пример 3: чтение изображения с прозрачным каналом
В этом примере мы будем читать изображение с каналом прозрачности. Если в изображении есть канал прозрачности, мы можем передать IMREAD_UNCHANGED для чтения вместе с цветовыми каналами.
import cv2
img = cv2.imread('D:/image-1.png', cv2.IMREAD_UNCHANGED)
print('Image Dimensions :', img.shape)
Вывод:
Image Dimensions : (400, 640, 4)
Мы прочитали все четыре канала изображения, именно красный, зеленый, синий и прозрачность.
Цветовые каналы
imread() декодирует изображение в матрицу с цветовыми каналами, хранящимися в следующем порядке: синий, зеленый, красный и A (прозрачность) соответственно.
Если (400, 640, 4) – это форма изображения, то:
- (:,:, 0) представляет синий канал;
- (:,:, 1) представляет зеленый канал;
- (:,:, 2) представляет красный канал;
- (:,:, 3) представляет канал прозрачностию
Расширения файлов
Для изображений используется множество расширений в зависимости от операционной системы, техники сжатия и т.д.
Когда метод imread() считывает изображение, он не учитывает расширение имени файла изображения для определения формата. Но определяет расширение на основе формата, представленного в данных файла.
imread() поддерживает файлы JPEG, PNG и TIFF на всех платформах. Но для комбинации других форматов и операционных систем функция может рассматривать кодеки уровня операционной системы.
Заключение
Завершая это руководство по примерам Python, мы научились использовать метод cv2 imread() для чтения изображения в массиве.