«Это второй день моего участия в первом испытании обновлений 2022 года. Подробную информацию о мероприятии см.:Вызов первого обновления 2022 г."
Система координат в OpenCV
Чтобы лучше проиллюстрировать систему координат в OpenCV и доступ к отдельным пикселям, давайте сначала рассмотрим следующее изображение с низким разрешением:
Размер этого изображения 32х41 пиксель, то есть изображение имеет 1312 пикселей. Чтобы проиллюстрировать это далее, мы можем добавить количество пикселей к каждой оси, как показано на изображении ниже:
Теперь давайте посмотримПиксельный индекс формы. Обратите внимание, что индекс пикселя начинается с нуля, что означает, что верхний левый угол находится на, вместо. Изображение ниже, проиндексированное по 4 отдельным пикселям, где верхний левый угол изображения — это координаты начала координат:
Информацию об отдельных пикселях можно извлечь из изображения так же, как в Python, ссылаясь на отдельные элементы массива.
Порядок каналов в OpenCV
При использовании OpenCV используется порядок цветовых каналов в цветовом формате BGR вместо формата RGB. Порядок трех каналов можно увидеть на изображении ниже:
Структура пикселей изображения BGR отображается на рисунке ниже. Как презентация, детали иллюстрации, как получить доступ к пикселю (Y = N, X = 1):
Tips:OpenCV 的最初开发人员选择了 BGR 颜色格式(而不是 RGB 格式),是因为当时 BGR 颜色格式在软件供应商和相机制造商中非常流行,因此选择 BGR 是出于历史原因。
Кроме того, существуют другие пакеты Python, использующие цветовой формат RGB (например, Matplotlib использует цветовой формат RGB,Matplotlib— самая популярная библиотека 2D-графиков Python, предоставляющая различные методы построения графиков, которые вы можете просмотретьВизуализация Python-MatplotlibБольше подробностей). Поэтому нам нужно знать, как конвертировать изображения из одного формата в другой.
Как только мы научимся преобразовывать изображения из одного формата в другой, мы можем использоватьOpenCV
обработка изображений с использованиемMatplotlib
package предоставляет функции для отображения изображений, далее давайте посмотрим, как обрабатывать различные цветовые форматы, используемые двумя библиотеками.
Во-первых, мы используемcv2.imread()
Функция загружает изображение:
import cv2
img_OpenCV = cv2.imread('sigonghuiye.jpeg')
изображения хранятся вimg_OpenCV
переменная, потому чтоcv2.imread()
Функция загружает изображения в порядке BGR. Затем мы используемcv2.split()
Функция разбивает загруженное изображение на три канала (b, g, r). Аргументом этой функции является изображение, которое мы хотим сегментировать:
b, g, r = cv2.split(img_OpenCV)
Следующим шагом является объединение каналов (чтобы построить новое изображение на основе информации, предоставленной каналами), но в порядке, отличном от исходного. Мы меняем порядок каналов b и r, чтобы они соответствовали формату RGB, формату Matplotlib, который нам нужен:
img_matplotlib = cv2.merge([r, g, b])
На данный момент у нас есть два изображения (IMG_OpenCV и IMG_MATPLOTLIB), за которыми следует использование OpenCV и MATPLOTLIB, чтобы мы могли сравнить результаты. Сначала мы отобразим эти два изображения с помощью Matplotlib.
Чтобы отобразить два изображения с помощью Matplotlib в одном окне, мы будем использоватьsubplot
, который помещает несколько изображений в одно окно. допустимыйsubplot
используйте три параметра, например.subplot(m,n,p)
, в это время обработка подграфаГрафики в сетке, гдеопределить количество рядов,определить количество столбцов, аРешите, где разместить график в сетке. нужно использоватьMatplotlib
Для отображения изображения необходимо использоватьimshow
функция.
В этом случае, когда мы отображаем два изображения по горизонтали,,. Мы будем использовать первый подграф (img_OpenCV), для второго участка (img_matplotlib) используйте:
from matplotlib import pyplot as plt
plt.subplot(121)
plt.imshow(img_OpenCV)
plt.subplot(122)
plt.imshow(img_matplotlib)
plt.show()
Вывод программы показан ниже:
Как видно, первый подграфик отображает изображение в неправильном цвете (порядок BGR), а второй подграфик отображает изображение в правильном цвете (порядок RGB). Далее мы используемcv2.imshow()
Отображаются два изображения:
cv2.imshow('bgr image', img_OpenCV)
cv2.imshow('rgb image', img_matplotlib)
cv2.waitKey(0)
cv2.destroyAllWindows()
На следующем снимке экрана показан результат, полученный при выполнении приведенного выше кода:
Как и ожидалось, на снимке экрана первый график показывает изображение в правильном цвете, а второй график показывает изображение в неправильном цвете.
Кроме того, если мы хотим отобразить два изображения в одном окне, мы можем создать объединенное изображение, содержащее оба изображения, соединив два изображения по горизонтали. Для этого нам нужно использоватьNumPy
изconcatenate()
метод. Параметрами этого метода являются два изображения, которые должны быть объединены, и ось, по которой они должны быть сложены, здесь мы позволяемaxis = 1
(сложите их горизонтально):
import numpy as np
img_concats = np.concatenate((img_OpenCV, img_matplotlib), axis=1)
cv2.imshow('bgr image and rgb image', img_concats)
cv2.waitKey(0)
cv2.destroyAllWindows()
На изображении ниже показано подключенное изображение:
Одним из факторов, который следует учитывать, являетсяcv2.split()
является трудоемкой операцией. Если вам нужно разделить разные каналы, вам следует сначала рассмотреть возможность использования индексации NumPy. Например, если вы хотите получить один канал изображения, вы можете использовать индексацию NumPy для получения канала:
B = img_OpenCV[:, :, 0]
G = img_OpenCV[:, :, 1]
R = img_OpenCV[:, :, 2]
Еще одна вещь, которую следует отметить, это то, что вы можете использоватьNumPy
Преобразование изображения из BGR в RGB одним оператором:
img_matplotlib = img_OpenCV[:, :, ::-1]