Python OpenCV - imshow не нуждается в конвертации из BGR в RGB

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

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

Но когда я пытаюсь просто прочитать изображение и показать его, раскраска выглядит хорошо (без необходимости конвертировать BGR в RGB):

img_bgr = cv2.imread(image_path)
cv2.imshow('BGR Image',img_bgr)
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
cv2.imshow('RGB Image',img_rgb )
cv2.waitkey(0)

Таким образом, imshow() автоматически изменяет цветовое пространство внутри функции (с BGR на RGB), или цветовое пространство всегда было BGR?

Ответ 1

BGR и RGB не являются цветовыми пространствами, они просто обозначают порядок различных цветовых каналов. cv2.cvtColor(img, cv2.COLOR_BGR2RGB) не выполняет никаких вычислений (например, преобразование, скажем, HSV), а просто переключает порядок. Любой порядок был бы действительным - в действительности, три значения (красное, зеленое и синее) сложены так, чтобы образовать один пиксель. Вы можете расположить их по своему усмотрению, пока вы указываете дисплею, какой порядок вы им дали.

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

Хотя BGR постоянно используется в OpenCV, большинство других библиотек обработки изображений используют порядок RGB. Если вы хотите использовать matplotlib imshow, но читать изображение с помощью OpenCV, вам нужно будет конвертировать из BGR в RGB.

Ответ 2

screen = cv2.cvtColor(screen, cv2.COLOR_RGB2BGR)

этот однострочный код меняет RGB на BGR