Чтение, просмотр и запись изображений являются основными в обработке изображений и компьютерном зрении. Даже при обрезке, изменении размера, повороте или применении различных фильтров для обработки изображений, сначала вам потребуется прочитать изображения. Поэтому важно, чтобы вы освоили эти базовые операции.
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<opencv2/opencv.hpp> #include<iostream> // 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<opencv2/opencv.hpp> #include<iostream> // Namespace nullifies the use of cv::function(); using namespace std; using namespace cv;
Чтение изображения
Для чтения изображения используйте функцию imread() в OpenCV. Вот синтаксис:
imread(filename, flags)
Она принимает два аргумента:
- Первый аргумент – это имя изображения, которое должно содержать полное имя пути к файлу.
- Второй аргумент – необязательный флаг, позволяющий указать, как должно быть представлено изображение. OpenCV предлагает несколько вариантов этого флага, но наиболее распространенными являются следующие:
cv2.IMREAD_UNCHANGED
or-1
cv2.IMREAD_GRAYSCALE
or0
cv2.IMREAD_COLOR
or1
По умолчанию значение флагов равно 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(window_name, image)
Эта функция также принимает два аргумента:
- Первый аргумент – это имя окна, которое будет отображаться в окне.
- Второй аргумент – изображение, которое вы хотите отобразить.
Чтобы отобразить несколько изображений одновременно, укажите имя нового окна для каждого изображения, которое вы хотите отобразить.
Функция 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()
. Ознакомьтесь с ее синтаксисом:
imwrite(filename, image)
.
- Первым аргументом является имя файла, которое должно включать расширение имени файла (например, .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.