Cv2.imread: примеры (PYTHON)
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-битного медицинского изображения:
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
Пакетная загрузка нескольких изображений с обработкой ошибок:
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')Загрузка изображения из памяти (буфера байтов):
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)Загрузка с автоматическим определением цветового пространства:
img = cv2.imread('image.jpg', cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH)Создание гистограммы после загрузки в оттенках серого:
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()Загрузка и немедленное изменение размера:
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)Проверка наличия альфа-канала после загрузки:
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('Изображение без альфа-канала')