Чтение, просмотр и запись изображения с помощью OpenCV

477
Чтение, просмотр и запись изображения с помощью OpenCV
Чтение, просмотр и запись изображения с помощью OpenCV

Чтение, просмотр и запись изображений являются основными в обработке изображений и компьютерном зрении. Даже при обрезке, изменении размера, повороте или применении различных фильтров для обработки изображений, сначала вам потребуется прочитать изображения. Поэтому важно, чтобы вы освоили эти базовые операции.

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

  1. imread() помогает нам читать изображение
  2. imshow() выводит изображение в окно
  3. 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)

Она принимает два аргумента:

  1. Первый аргумент – это имя изображения, которое должно содержать полное имя пути к файлу.
  2. Второй аргумент – необязательный флаг, позволяющий указать, как должно быть представлено изображение. 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(window_name, image)

Эта функция также принимает два аргумента:

  1. Первый аргумент – это имя окна, которое будет отображаться в окне.
  2. Второй аргумент – изображение, которое вы хотите отобразить.

Чтобы отобразить несколько изображений одновременно, укажите имя нового окна для каждого изображения, которое вы хотите отобразить.

Функция 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).
Отображение изображения в цвете с помощью функции imshow().
Отображение изображения в цвете с помощью функции imshow().
Отображение изображения в оттенках серого с помощью функции imshow().
Отображение изображения в оттенках серого с помощью функции imshow().
Отображение неизмененного изображения с помощью функции imshow().
Отображение неизмененного изображения с помощью функции imshow().

Приведенный ниже GIF показывает выполнение кода для чтения и отображения изображения, но без waitKey(). Окно уничтожается в течение миллисекунд, и на экран не выводится никакой информации.

выполнение кода для чтения и отображения изображения, но без waitKey()
выполнение кода для чтения и отображения изображения, но без waitKey()

Запись изображения

Наконец, давайте обсудим, как записать/сохранить изображение в каталог файлов, используя функцию imwrite(). Ознакомьтесь с ее синтаксисом:

imwrite(filename, image).

  1. Первым аргументом является имя файла, которое должно включать расширение имени файла (например, .png, .jpg и т.д.). OpenCV использует это расширение имени файла для определения формата файла.
  2. Второй аргумент – изображение, которое вы хотите сохранить. Функция возвращает True, если изображение успешно сохранено.

Взгляните на приведенный ниже код. Посмотрите, как просто записывать изображения на диск. Просто укажите имя файла с соответствующим расширением (с добавлением любого желаемого пути). Укажите имя переменной, содержащей данные изображения, и все готово.

Python

cv2.imwrite('grayscale.jpg',img_grayscale)

C++

    
imwrite("grayscale.jpg", img_grayscale);

Подводим итоги

Здесь вы научились пользоваться:

  • функцииimread()imshow() и imwrite() для чтения, отображения и записи изображений
  • функции waitKey() и destroyAllWindows() а также функция отображения для
    • закрытия окна изображения при нажатии клавиши
    • и очистить любое открытое окно изображения из памяти.

Вам придется много экспериментировать, когда речь идет о функции waitkey(), поскольку она может быть довольно запутанной. Чем больше вы с ней познакомитесь, тем лучше сможете ее использовать. Загрузите полный код, чтобы получить практический опыт. Тренируйтесь, ведь это основные строительные блоки, которые действительно помогут вам изучить и освоить библиотеку OpenCV → OpenCV colab notebook.