Хотите поиграть с кодом? "Связь"
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)