OpenCV: считывания картинки через imread()
Прежде чем проводить какие-нибудь манипуляции с изображением — его нужно предварительно считать из файла.
В OpenCV для этого используется функция imread().
Mat cv::imread( const String & filename, int flags = IMREAD_COLOR )
retval = cv2.imread( filename[, flags] )
Возможные параметры (flags):
IMREAD_UNCHANGED
Python: cv.IMREAD_UNCHANGED
Если установлен — возвращает загруженное изображение как есть (с альфа-каналом, иначе он будет обрезан).
IMREAD_GRAYSCALE
Python: cv.IMREAD_GRAYSCALE
— преобразует изображение в одноканальное изображение в оттенках серого (внутреннее преобразование кодека).
IMREAD_COLOR
Python: cv.IMREAD_COLOR
— преобразует изображение в 3-канальное цветное изображение BGR.
IMREAD_ANYDEPTH
Python: cv.IMREAD_ANYDEPTH
— возвращает 16-битное / 32-битное изображение, когда вход имеет соответствующую глубину, в противном случае — преобразует его в 8-битное.
IMREAD_ANYCOLOR
Python: cv.IMREAD_ANYCOLOR
— изображение считывается в любом возможном цветовом формате.
IMREAD_LOAD_GDAL
Python: cv.IMREAD_LOAD_GDAL
— использовать драйвер gdal для загрузки изображения.
IMREAD_REDUCED_GRAYSCALE_2
Python: cv.IMREAD_REDUCED_GRAYSCALE_2
— преобразовать изображение в одноканальное изображение в оттенках серого и уменьшить размер изображения на 1/2.
IMREAD_REDUCED_COLOR_2
Python: cv.IMREAD_REDUCED_COLOR_2
— преобразовать изображение в 3-канальное цветное изображение BGR и уменьшить размер изображения на 1/2.
IMREAD_REDUCED_GRAYSCALE_4
Python: cv.IMREAD_REDUCED_GRAYSCALE_4
— преобразовать изображение в одноканальное изображение в оттенках серого и уменьшить размер изображения на 1/4.
IMREAD_REDUCED_COLOR_4
Python: cv.IMREAD_REDUCED_COLOR_4
— преобразовать изображение в 3-канальное цветное изображение BGR и уменьшить размер изображения на 1/4.
IMREAD_REDUCED_GRAYSCALE_8
Python: cv.IMREAD_REDUCED_GRAYSCALE_8
— преобразовать изображение в одноканальное изображение в оттенках серого и уменьшить размер изображения на 1/8.
IMREAD_REDUCED_COLOR_8
Python: cv.IMREAD_REDUCED_COLOR_8
— преобразовать изображение в 3-канальное цветное изображение BGR и уменьшить размер изображения на 1/8.
IMREAD_IGNORE_ORIENTATION
Python: cv.IMREAD_IGNORE_ORIENTATION
— не поворачивать изображение в соответствии с флагом ориентации EXIF.
Попробуем считать нашу тестовую картинку.
Подключаем нужные библиотеки:
import matplotlib.pyplot as plt %matplotlib inline import cv2 print('OpenCV version:', cv2.__version__)
OpenCV version: 3.4.2
Считаем тестовое изображение:
imgorig = cv2.imread('cat2.jpg') print(type(imgorig)) print(imgorig.shape)
(278, 345, 3)
Посмотрим на нашу картинку:
plt.imshow(imgorig) plt.show()

Неожиданно! В чём же дело?
А в том, что OpenCV в качестве порядка хранения цветов изображения, по-умолчанию, использует порядок BGR, а matplotlib использует RGB.
Поэтому, при попытке отображении matplotlib-ом изображения, загруженного с помощью OpenCV, возникает путаница в порядке каналов и получается подобный эффект.
Чтобы решить эту проблему, достаточно сконвертировать картинку в RGB-формат при помощи функции cv2.cvtColor().
rgb_img = cv2.cvtColor(imgorig, cv2.COLOR_BGR2RGB) plt.imshow(rgb_img) plt.show()

Отлично!
Остаётся только единственный вопрос:
Почему в OpenCV по-умолчанию используется формат BGR ?
Поиск даёт единственный ответ — по историческим причинам.
В ранних версиях OpenCV использовался порядок BGR, так как тогда именно формат BGR был популярен среди производителей камер и поставщиков программного обеспечения.
Например, в ОС Windows для указания значения цвета с помощью COLORREF используется именно формат BGR:
0x00bbggrr
Вот и выходит, что по историческим причинам, в OpenCV и сейчас, по-умолчанию, используется порядок цветов BGR. Остаётся только помнить об этом.
Чтение, просмотр и запись изображения с помощью OpenCV

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

Сначала просмотрите этот пример кода. Он считывает и отображает приведенное выше изображение. Посмотрите, он включает все три функции, которые мы только что упомянули. В дальнейшем мы обсудим каждую функцию, используемую в этой реализации.
Python
# import the cv2 library import cv2 # The function cv2.imread() is used to read an image. img_grayscale = cv2.imread('test.jpg',0) # The function cv2.imshow() is used to display an image in a window. cv2.imshow('graycsale image',img_grayscale) # waitKey() waits for a key press to close the window and 0 specifies indefinite loop cv2.waitKey(0) # cv2.destroyAllWindows() simply destroys all the windows we created. cv2.destroyAllWindows() # The function cv2.imwrite() is used to write an image. cv2.imwrite('grayscale.jpg',img_grayscale)
C++
//Include Libraries #include #include // Namespace nullifies the use of cv::function(); using namespace std; using namespace cv; // Read an image Mat img_grayscale = imread("test.jpg", 0); // Display the image. imshow("grayscale image", img_grayscale); // Wait for a keystroke. waitKey(0); // Destroys all the windows created destroyAllWindows(); // Write the image in the same directory imwrite("grayscale.jpg", img_grayscale);
Начнем с импорта библиотеки OpenCV в Python и C++ (как показано ниже).
Python:
# import the cv2 library import cv2
В C++ для этого используйте #include (как показано ниже). Также указание пространства имен позволяет ссылаться на имена функций напрямую. Нет необходимости добавлять к ним пространство имен (например, вместо cv::imread() можно просто напрямую использовать read()).
C++:
//Include Libraries #include #include // Namespace nullifies the use of cv::function(); using namespace std; using namespace cv;
Чтение изображения
Для чтения изображения используйте функцию imread() в OpenCV. Вот синтаксис:
Она принимает два аргумента:
- Первый аргумент – это имя изображения, которое должно содержать полное имя пути к файлу.
- Второй аргумент – необязательный флаг, позволяющий указать, как должно быть представлено изображение. OpenCV предлагает несколько вариантов этого флага, но наиболее распространенными являются следующие:
- cv2.IMREAD_UNCHANGED or -1
- cv2.IMREAD_GRAYSCALE or 0
- cv2.IMREAD_COLOR or 1
По умолчанию значение флагов равно 1, что приведет к считыванию изображения как цветного. Если вы хотите считать изображение в определенном формате, просто укажите соответствующий флаг. Чтобы ознакомиться с различными вариантами флагов, нажмите здесь.
Также важно отметить, что OpenCV читает цветные изображения в формате BGR, в то время как большинство других библиотек компьютерного зрения используют порядок каналов RGB. Поэтому при использовании OpenCV с другими наборами инструментов не забудьте поменять местами синий и красный цветовые каналы при переходе от одной библиотеки к другой.
Как показано в следующих разделах кода, сначала мы прочитаем тестовое изображение, используя все три значения флагов, описанные выше.
Python
# Read an image img_color = cv2.imread('test.jpg',cv2.IMREAD_COLOR) img_grayscale = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE) img_unchanged = cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)
C++
// Read an image Mat img_color = imread("test.jpg", IMREAD_COLOR); Mat img_grayscale = imread("test.jpg", IMREAD_GRAYSCALE); Mat img_unchanged = imread("test.jpg", IMREAD_UNCHANGED);
Python
img_color = cv2.imread('test.jpg',1) img_grayscale = cv2.imread('test.jpg',0) img_unchanged = cv2.imread('test.jpg',-1)
C++
Mat img_color = imread("test.jpg", 1); Mat img_grayscale = imread("test.jpg", 0); Mat img_unchanged = imread("test.jpg", -1);
Отображение изображения
В OpenCV изображение выводится на экран с помощью функции imshow(). Вот синтаксис:
Эта функция также принимает два аргумента:
- Первый аргумент – это имя окна, которое будет отображаться в окне.
- Второй аргумент – изображение, которое вы хотите отобразить.
Чтобы отобразить несколько изображений одновременно, укажите имя нового окна для каждого изображения, которое вы хотите отобразить.
Функция imshow() предназначена для использования вместе с функциями waitKey() и destroyAllWindows() / destroyWindow() functions.
Функция waitKey() – это функция привязки клавиатуры.
- Она принимает единственный аргумент – время (в миллисекундах), в течение которого будет отображаться окно.
- Если пользователь нажмет любую клавишу в течение этого периода времени, программа продолжит работу.
- Если передается 0, программа ожидает нажатия клавиши неопределенное время.
- Вы также можете настроить функцию на обнаружение определенных нажатий клавиш, например, клавиши Q или ESC на клавиатуре, таким образом, более четко указывая, какая клавиша должна вызвать определенное поведение.
Функция destroyAllWindows() уничтожает все созданные нами окна. Если необходимо уничтожить конкретное окно, укажите точное имя окна в качестве аргумента. Использование функции destroyAllWindows() также очищает окно или изображение из основной памяти системы. Примеры кода ниже показывают, как функция imshow() используется для отображения прочитанных изображений.
Python
#Displays image inside a window cv2.imshow('color image',img_color) cv2.imshow('grayscale image',img_grayscale) cv2.imshow('unchanged image',img_unchanged) # Waits for a keystroke cv2.waitKey(0) # Destroys all the windows created cv2.destroyAllwindows()
C++
// Create a window. namedWindow( "color image", WINDOW_AUTOSIZE ); namedWindow( "grayscale image", WINDOW_AUTOSIZE ); namedWindow( "unchanged image", WINDOW_AUTOSIZE ); // Show the image inside it. imshow( "color image", img_color ); imshow( "grayscale image", img_grayscale ); imshow( "unchanged image", img_unchanged ); // Wait for a keystroke. waitKey(0); // Destroys all the windows created destroyAllWindows();
Ниже приведен GIF, демонстрирующий процесс выполнения кода, визуализации результатов и закрытия окна вывода:
На трех экранах вывода, показанных ниже, можно увидеть:
- Первое изображение отображается в цвете
- Следующее – в градациях серого
- Третье – снова в цвете, так как это был исходный формат изображения (которое было прочитано с помощью cv2.IMREAD_UNCHANGED).



Приведенный ниже GIF показывает выполнение кода для чтения и отображения изображения, но без waitKey() . Окно уничтожается в течение миллисекунд, и на экран не выводится никакой информации.
Запись изображения
Наконец, давайте обсудим, как записать/сохранить изображение в каталог файлов, используя функцию imwrite() . Ознакомьтесь с ее синтаксисом:
- Первым аргументом является имя файла, которое должно включать расширение имени файла (например, .png, .jpg и т.д.). OpenCV использует это расширение имени файла для определения формата файла.
- Второй аргумент – изображение, которое вы хотите сохранить. Функция возвращает True, если изображение успешно сохранено.
Взгляните на приведенный ниже код. Посмотрите, как просто записывать изображения на диск. Просто укажите имя файла с соответствующим расширением (с добавлением любого желаемого пути). Укажите имя переменной, содержащей данные изображения, и все готово.
Python
cv2.imwrite('grayscale.jpg',img_grayscale)
C++
imwrite("grayscale.jpg", img_grayscale);
Подводим итоги
Здесь вы научились пользоваться:
- функции imread() , imshow() и imwrite() для чтения, отображения и записи изображений
- функции waitKey() и destroyAllWindows() а также функция отображения для
- закрытия окна изображения при нажатии клавиши
- и очистить любое открытое окно изображения из памяти.
Вам придется много экспериментировать, когда речь идет о функции waitkey() , поскольку она может быть довольно запутанной. Чем больше вы с ней познакомитесь, тем лучше сможете ее использовать. Загрузите полный код, чтобы получить практический опыт. Тренируйтесь, ведь это основные строительные блоки, которые действительно помогут вам изучить и освоить библиотеку OpenCV → OpenCV colab notebook.
Не открывается изображение openCV
Для конкатенации путей используйте os.path.join(). Выведите full_path и проверьте, что по этому пути действительно есть картинка.
21 мая 2021 в 2:54
Оно не работает даже если поместить код в папку с картинкой и обратиться по имени
21 мая 2021 в 7:141 ответ 1
Сортировка: Сброс на вариант по умолчанию
У OpenCV есть проблемы с чтением из файлов содержащими в пути или имени не английские символы. Чтобы прочитать такие файлы вместо imread() можно использовать такую конструкцию:
image = cv2.imdecode(np.fromfile(full_path, dtype=np.uint8), cv2.IMREAD_COLOR)Ну и полный пример, который работает с русскими именами в пути. И, да, chdir тут совершенно не нужен.
import os, cv2 import numpy as np CORRECT_EXTENTIONS = ["png"] def test(): images = [] directory = r".\Русский" for file in os.listdir(directory): extention = file.split('.')[-1] if extention in CORRECT_EXTENTIONS: full_path = os.path.join(directory, file) image = cv2.imdecode(np.fromfile(full_path, dtype=np.uint8), cv2.IMREAD_COLOR) image_mask = cv2.inRange(image, (0,0,0), (127,127,127)) images.append(cv2.resize(image_mask, (64,64))) cv2.imshow('image', np.hstack([image, cv2.cvtColor(image_mask, cv2.COLOR_GRAY2BGR)])) cv2.waitKey(0) return images test()Как использовать Python для обработки изображений
Изучите обработку изображений с помощью Python: основные библиотеки, примеры их использования и рекомендации для новичков!
Алексей Кодов
Автор статьи
10 июля 2023 в 17:48Обработка изображений является важным аспектом программирования, и Python предоставляет мощные инструменты для выполнения этой задачи. В этой статье мы рассмотрим основные библиотеки, которые можно использовать для работы с изображениями, и приведем примеры их использования.
PIL и Pillow
PIL (Python Imaging Library) — это одна из первых и наиболее известных библиотек для работы с изображениями в Python. Однако с течением времени она перестала обновляться, и появился ее форк под названием Pillow. Pillow совместима с PIL, но имеет ряд улучшений и исправлений ошибок.
Чтобы установить Pillow, выполните следующую команду:
pip install pillowПример: открытие и сохранение изображения с помощью Pillow
from PIL import Image # Открыть изображение image = Image.open("input.jpg") # Сохранить изображение в другом формате image.save("output.png")OpenCV
OpenCV (Open Source Computer Vision) — это библиотека компьютерного зрения с открытым исходным кодом. Она предоставляет множество алгоритмов и функций для работы с изображениями и видео. Чтобы установить OpenCV, выполните следующую команду:
pip install opencv-pythonПример: преобразование изображения в оттенки серого с помощью OpenCV
import cv2 # Открыть изображение image = cv2.imread("input.jpg") # Преобразовать изображение в оттенки серого gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Сохранить изображение cv2.imwrite("output.jpg", gray_image)Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT
Imageio
Imageio — это еще одна библиотека для работы с изображениями, которая поддерживает большое количество форматов. Она предоставляет простой API для чтения и записи изображений. Чтобы установить Imageio, выполните следующую команду:
pip install imageioПример: создание анимированного GIF с помощью Imageio
import imageio # Загрузить несколько изображений images = [imageio.imread("frame1.png"), imageio.imread("frame2.png"), imageio.imread("frame3.png")] # Создать анимированный GIF imageio.mimsave("animation.gif", images, duration=0.5)Заключение
В этой статье мы рассмотрели некоторые основные библиотеки для работы с изображениями в Python: Pillow, OpenCV и Imageio. Каждая из них имеет свои преимущества и может быть использована в зависимости от задачи и предпочтений разработчика.
Не забывайте продолжать изучать Python и развивать свои навыки! Удачи вам в изучении обработки изображений с помощью Python!