Cv2.imread: примеры (PYTHON)

Загрузка изображений в Python с помощью cv2.imread из OpenCV
Раздел: OpenCV, Ввод/вывод изображений
cv2.imread(filename: str): numpy.ndarray

Описание функции cv2.imread

Функция cv2.imread из библиотеки OpenCV предназначена для загрузки изображений из файлов в память программы. Она используется на начальном этапе обработки изображений в компьютерном зрении, машинном обучении и графических приложениях.

Синтаксис функции: cv2.imread(filename, flags=cv2.IMREAD_COLOR)

Параметр filename принимает строку с абсолютным или относительным путем к файлу изображения. Поддерживаются форматы: BMP, JPEG, PNG, TIFF, WebP и другие.

Параметр flags определяет способ загрузки изображения:

  • cv2.IMREAD_COLOR (значение 1) - загружает цветное изображение в формате BGR (3 канала)
  • cv2.IMREAD_GRAYSCALE (значение 0) - загружает изображение в оттенках серого (1 канал)
  • cv2.IMREAD_UNCHANGED (значение -1) - загружает изображение со всеми каналами, включая альфа-канал
  • cv2.IMREAD_ANYDEPTH (значение 2) - возвращает 16-битные или 32-битные изображения
  • cv2.IMREAD_ANYCOLOR (значение 4) - загружает изображение в любом цветовом формате
  • cv2.IMREAD_REDUCED_GRAYSCALE_2, cv2.IMREAD_REDUCED_COLOR_2 и аналогичные с коэффициентами 4 и 8 - загружают уменьшенные версии изображений

Функция возвращает объект numpy.ndarray с данными изображения или None, если файл не существует, поврежден или имеет неподдерживаемый формат.

Основные примеры использования

Простая загрузка цветного изображения:

import cv2

img = cv2.imread('image.jpg')
print(f'Тип: {type(img)}')
print(f'Размер: {img.shape}')
print(f'Тип данных: {img.dtype}')
Тип: <class 'numpy.ndarray'>
Размер: (480, 640, 3)
Тип данных: uint8

Загрузка в оттенках серого:

img_gray = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
print(f'Размер: {img_gray.shape}')
Размер: (480, 640)

Загрузка изображения с альфа-каналом:

img_with_alpha = cv2.imread('image.png', cv2.IMREAD_UNCHANGED)
print(f'Каналы: {img_with_alpha.shape[2]}')
Каналы: 4

Использование флага для уменьшенной версии:

img_small = cv2.imread('image.jpg', cv2.IMREAD_REDUCED_COLOR_2)
print(f'Уменьшенный размер: {img_small.shape}')
Уменьшенный размер: (240, 320, 3)

Альтернативные функции в Python

Библиотека PIL/Pillow предоставляет функцию Image.open(), которая возвращает объект Image, а не numpy-массив. Для преобразования в массив требуется дополнительный шаг.

from PIL import Image
import numpy as np

img_pil = Image.open('image.jpg')
img_array = np.array(img_pil)

Библиотека imageio предлагает функцию imageio.imread(), которая автоматически определяет формат и возвращает numpy-массив. Поддерживает анимацию и специализированные форматы.

import imageio

img = imageio.imread('image.jpg')

Библиотека scikit-image содержит функцию skimage.io.imread(), совместимую с различными источниками данных, включая URL.

from skimage import io

img = io.imread('image.jpg')

Матаplotlib предоставляет plt.imread(), которая удобна для интеграции с графиками, но может изменять порядок каналов.

import matplotlib.pyplot as plt

img = plt.imread('image.jpg')

Выбор функции зависит от требований проекта: OpenCV оптимален для компьютерного зрения, PIL - для базовой обработки, imageio - для специализированных форматов.

Аналоги в других языках программирования

В JavaScript с использованием Node.js и библиотеки sharp:

const sharp = require('sharp');

sharp('image.jpg')
  .toBuffer()
  .then(data => console.log(data));

В Java с использованием библиотеки OpenCV:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;

Mat img = Imgcodecs.imread("image.jpg");

В C# с помощью Emgu.CV (обертка OpenCV для .NET):

using Emgu.CV;
using Emgu.CV.Structure;

Mat img = CvInvoke.Imread("image.jpg", Emgu.CV.CvEnum.ImreadModes.Color);

В PHP с использованием расширения GD:

$img = imagecreatefromjpeg('image.jpg');

В Go с библиотекой go-opencv:

import "gocv.io/x/gocv"

img := gocv.IMRead("image.jpg", gocv.IMReadColor)

В Kotlin с OpenCV для Android:

import org.opencv.android.Utils
import org.opencv.core.Mat
import org.opencv.imgcodecs.Imgcodecs

val img: Mat = Imgcodecs.imread("image.jpg")

Основное отличие от Python-версии - синтаксис и типы возвращаемых данных, хотя логика работы остается аналогичной.

Типичные ошибки при использовании

Ошибка при отсутствии файла приводит к возврату None:

img = cv2.imread('nonexistent.jpg')
print(img)
None

Попытка обработки None как массива вызывает исключение:

img = cv2.imread('nonexistent.jpg')
height = img.shape[0]
AttributeError: 'NoneType' object has no attribute 'shape'

Неправильный формат файла или поврежденные данные:

# Создание текстового файла с расширением .jpg
with open('fake.jpg', 'w') as f:
    f.write('not an image')

img = cv2.imread('fake.jpg')
print(img)
None

Использование неправильного пути в Windows без экранирования:

# Неправильно:
img = cv2.imread('C:\Users\name\image.jpg')

# Правильно:
img = cv2.imread('C:\\Users\\name\\image.jpg')
# Или с raw-строкой:
img = cv2.imread(r'C:\Users\name\image.jpg')

Забытый импорт библиотеки вызывает NameError:

img = cv2.imread('image.jpg')
NameError: name 'cv2' is not defined

Изменения в последних версиях OpenCV

В OpenCV 4.x были добавлены флаги для загрузки уменьшенных версий изображений: IMREAD_REDUCED_GRAYSCALE_2, IMREAD_REDUCED_COLOR_4, IMREAD_REDUCED_GRAYSCALE_8 и другие.

Начиная с OpenCV 3.x, функция поддерживает загрузку изображений в формате WebP при наличии соответствующих кодеков в системе.

В версии 4.5.1 улучшена обработка метаданных EXIF при загрузке JPEG-файлов с автоматическим поворотом согласно ориентации.

Были оптимизированы алгоритмы декодирования для уменьшения потребления памяти при работе с большими изображениями.

Расширенные примеры использования

Загрузка 16-битного медицинского изображения:

Пример python
import cv2
import numpy as np

# Загрузка с сохранением глубины цвета
img_16bit = cv2.imread('medical_image.tiff', cv2.IMREAD_ANYDEPTH)
print(f'Тип данных: {img_16bit.dtype}')
print(f'Диапазон значений: {np.min(img_16bit)} - {np.max(img_16bit)}')
Тип данных: uint16
Диапазон значений: 0 - 65535

Пакетная загрузка нескольких изображений с обработкой ошибок:

Пример python
import cv2
import os

def load_images_from_folder(folder):
    images = []
    for filename in os.listdir(folder):
        img_path = os.path.join(folder, filename)
        img = cv2.imread(img_path)
        if img is not None:
            images.append(img)
        else:
            print(f'Не удалось загрузить: {filename}')
    return images

images = load_images_from_folder('dataset')

Загрузка изображения из памяти (буфера байтов):

Пример python
import cv2
import numpy as np

# Чтение файла в память
with open('image.jpg', 'rb') as f:
    buffer = f.read()

# Преобразование в numpy массив
nparr = np.frombuffer(buffer, np.uint8)

# Декодирование из памяти
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

Загрузка с автоматическим определением цветового пространства:

Пример python
img = cv2.imread('image.jpg', cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH)

Создание гистограммы после загрузки в оттенках серого:

Пример python
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([img], [0], None, [256], [0,256])

plt.plot(hist)
plt.show()

Загрузка и немедленное изменение размера:

Пример python
import cv2

# Загрузка с уменьшением в 8 раз
img = cv2.imread('large_image.jpg', cv2.IMREAD_REDUCED_COLOR_8)

# Дальнейшее уменьшение
img_small = cv2.resize(img, (0,0), fx=0.5, fy=0.5)

Проверка наличия альфа-канала после загрузки:

Пример python
img = cv2.imread('image_with_transparency.png', cv2.IMREAD_UNCHANGED)

if img.shape[2] == 4:
    print('Изображение с альфа-каналом')
    b, g, r, a = cv2.split(img)
else:
    print('Изображение без альфа-канала')

питон cv2.imread function comments

En
Cv2.imread Read image from file