Хотите поиграть с кодом? "Связь"

import os
import numpy as np
import argparse
import cv2
import matplotlib.pyplot as plt

Исходное изображение выглядит так:

OpenCV предполагает, что изображения находятся в порядке канала BGR. OpenCV imread, imwrite и imshow работают с порядком BGR, поэтому изображение не изменится, если мы используем cv2.imshow для отображения изображения. Но это не работает с matplotlib.

Большинство библиотек обработки изображений используют порядок RGB, такой как matplotlib, поэтому при использовании plt.imshow цвет логотипа изменился.

img = cv2.imread("logo.png")
# show the image by cv2
# The cv2.imshow() and cv.imshow() functions from the opencv-python package are incompatible with Jupyter notebook; 
# see https://github.com/jupyter/notebook/issues/3935. 
# As a replacement, you can use the following function:
from google.colab.patches import cv2_imshow
cv2_imshow(img)

# show the image by matplotlib
plt.subplot(111)
plt.imshow(img)
plt.title("Original")

Если мы хотим прочитать изображение в порядке RGB в OpenCV, мы можем использовать:

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# read images in RGB order in OpenCV
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
from google.colab.patches import cv2_imshow
cv2_imshow(img_rgb)
plt.imshow(img_rgb)

cv2.imread(ИМЯ ФАЙЛА, ФЛАГ)

Есть несколько флагов:

cv2.IMREAD_UNCHANGED: читать изображение как есть из источника (с альфа-каналом). Если исходное изображение представляет собой RGB, оно загружается в массив с красными, зелеными и синими каналами.

cv2.IMREAD_COLOR: конвертировать изображение в 3-канальное цветное изображение BGR, но без канала прозрачности.

cv2.IMREAD_GRAYSCALE: преобразовать изображение в одноканальное изображение в градациях серого.

Проверьте больше флагов здесь: OpenCV: флаги, используемые для чтения и записи файла изображения

img = cv2.imread('logo.png', cv2.IMREAD_UNCHANGED)
cv2_imshow(img)
plt.imshow(img)

img = cv2.imread('logo.png', cv2.IMREAD_COLOR)
cv2_imshow(img)
plt.imshow(img)

img = cv2.imread('logo.png', cv2.IMREAD_GRAYSCALE)
cv2_imshow(img)

Давайте посмотрим на канал BGR. Если мы хотим напечатать весь массив, установите np.set_printoptions(threshold=np.inf) и верните его к значению по умолчанию после печати массива. np.set_printoptions(threshold=1000

img = cv2.imread('logo.png', cv2.IMREAD_COLOR)
cv2_imshow(img)
b = img[:,:,0] # get blue channel
g = img[:,:,1] # get green channel
r = img[:,:,2] # get red channel

print(b)

np.set_printoptions(threshold=np.inf)
print(b)
np.set_printoptions(threshold=1000)
# the output is really long so I won't print it here.

Теперь давайте конвертируем его в канал RGB. Несмотря на то, что мы читаем изображение в порядке RGB, цвет логотипа изменится, если мы используем cv2.imshow для отображения изображения, потому что он работает с порядком BGR. plt.imshow показывают исходный цвет изображения, поскольку он также работает с порядком RGB.

# read images in RGB order in OpenCV
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
from google.colab.patches import cv2_imshow
cv2_imshow(img_rgb)
plt.imshow(img_rgb)

r1 = img_rgb[:,:,0] # get blue channel
g1 = img_rgb[:,:,1] # get green channel
b1 = img_rgb[:,:,2] # get red channel
(img[:,:,0] == img_rgb[:,:,2]).all()
Output: True

Когда вы пытаетесь нарисовать прямоугольник в OpenCV, будьте осторожны, чтобы цвет прямоугольника также был в порядке BGR.

# read the image
image = cv2.imread('logo.png')


# represents the top left corner of rectangle
start_point = (5, 5)

# represents the bottom right corner of rectangle
end_point = (20, 20)

# choose the rectangle color in BGR
color = (0, 0, 255) # red

# thickness of lines that make up the rectangle is 2 px
thickness = 2

# draw a rectangle with red line borders of thickness of 2 px
image = cv2.rectangle(image, start_point, end_point, color, thickness)

# Displaying the image 
cv2_imshow(image)