Используя модуль Python-OpenCV, вы можете преобразовать изображение из цветного в черно-белое, из черно-белого в серое или из RGB в оттенок, насыщенность и значение. Понимание типов изображений и цветовых каналов имеет важное значение при работе с модулем cv2 в Python.
Мы можем думать, что изображения в Python — это пустые массивы, и с помощью модуля cv2 мы можем изменять массивы и преобразовывать изображения в различные формы. Давайте углубимся в эту тему.
Понимание типов изображений и цветовых каналов
Чтобы понять типы изображений и цветовые каналы, нам нужно разделить исходное изображение на три канала B, G, R. Затем мы отображаем цветовые каналы один за другим для анализа изображений.
Сначала мы создадим пустой массив одного и того же исходного изображения, а затем заполним цветовые каналы b, g, r для каждой матрицы, чтобы создать разные версии изображения с их цветовыми каналами. Чтобы продолжить, вам необходимо установить на свой компьютер библиотеку numpy и opencv-python.
Давайте импортируем библиотеки numpy и cv2.
|
1 2 |
import numpy as np import cv2 |
Теперь прочитайте новое изображение, используя метод cv2.imread(). Я буду использовать бесплатные изображения, доступные в Интернете.
|
1 2 3 4 5 |
import numpy as np import cv2 imgColor = cv2.imread('data.png', 1) cv2.imshow("Image", imgColor) |
Теперь мы явно устанавливаем для окна значение cv2.moveWindow() с тем же именем изображения «Image» и 0, 0. Это означает, что когда cv2 генерирует изображение, оно переместится в левый угол.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# app.py import numpy as np import cv2 imgColor = cv2.imread('data.png', 1) cv2.imshow("Image", imgColor) cv2.moveWindow("Image", 0, 0) print(imgColor.shape) cv2.waitKey(0) cv2.destroyAllWindows() |
Если вы запустите указанный выше файл с помощью команды python3 app.py, вы получите следующий вывод.
|
1 |
➜ pyt python3 app.py(271, 529, 3) |

Из вывода видно, что форма изображения(271, 529, 3). Значение высоты — 271, ширины — 529, а канала — 3.
Разделите фигуру изображения
Чтобы разделить фигуру на высоту, ширину и канал, напишите следующий код.
|
1 2 3 |
# app.py height, width, channels = imgColor.shape |
Нам нужен этот шаг, потому что теперь мы создадим пустой массив numpy и будем использовать эти измерения для построения массивов.
Разделение изображения на B, G и R
Метод Python cv2.split() разбивает изображение на компоненты B, G и R. Мы создадим три разных изображения на основе этих каналов, построив массивы.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# app.py import cv2 imgColor = cv2.imread('data.png', 1) cv2.imshow("Image", imgColor) cv2.moveWindow("Image", 0, 0) print(imgColor.shape) height, width, channels = imgColor.shape b, g, r = cv2.split(imgColor) rgb_split = np.empty([height, width * 3, 3], 'uint8') rgb_split[:, 0:width] = cv2.merge([b, b, b]) rgb_split[:, width: width * 2] = cv2.merge([g, g, g]) rgb_split[:, width * 2 : width * 3] = cv2.merge([r, r, r]) cv2.waitKey(0) cv2.destroyAllWindows() |
В этом коде мы разбили изображение на компоненты b, g, r.
Затем создал пустой массив той же высоты и ширины 3x, и этот массив содержит только значения типа данных uint. Этот массив принимает только значения пикселей от 0 до 255 из-за uint8.
|
1 2 3 |
rgb_split[:, 0:width] = cv2.merge([b, b, b]) rgb_split[:, width: width * 2] = cv2.merge([g, g, g]) rgb_split[:, width * 2 : width * 3] = cv2.merge([r, r, r]) |
В приведенном выше коде мы заполняем значения b, g, r в пустом массиве, чтобы создать три разные версии изображения с соответствующими каналами.
На последнем шаге нам нужно отобразить каналы изображения. Итак, наш окончательный код выглядит следующим образом.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# app.py import numpy as np import cv2 imgColor = cv2.imread('data.png', 1) cv2.imshow("Image", imgColor) cv2.moveWindow("Image", 0, 0) print(imgColor.shape) height, width, channels = imgColor.shape b, g, r = cv2.split(imgColor) rgb_split = np.empty([height, width * 3, 3], 'uint8') rgb_split[:, 0:width] = cv2.merge([b, b, b]) rgb_split[:, width: width * 2] = cv2.merge([g, g, g]) rgb_split[:, width * 2: width * 3] = cv2.merge([r, r, r]) cv2.imshow("Channels", rgb_split) cv2.moveWindow("Channels", 0, height) cv2.waitKey(0) cv2.destroyAllWindows() |
Вывод:

Вы можете видеть, что сначала это исходное изображение, а затем под ним три разных канала этого изображения. Итак, если вы хотите разделить изображение на другие каналы, используйте метод cv2.split() и назначьте разные компоненты новому массиву и объедините его для построения каналов.
