OpenGRV BGR и PyPlot RGB - PullRequest
       0

OpenGRV BGR и PyPlot RGB

0 голосов
/ 03 апреля 2020

Я узнал, что порядок цветов в OpenCV - BGR, а в Pyplot от Matpotlib - RGB. Поэтому я начал экспериментировать с чтением и отображением изображения, используя обе библиотеки. Вот изображение, с которым я экспериментировал: enter image description here

Это просто черно-белое изображение с красным цветом в некоторых частях. Теперь, когда я использовал pyplot.imshow (), чтобы отобразить копию изображения, прочитанную OpenCV, цвет t ie и обуви изменился на синий. То же самое произошло, когда я использовал cv2.imshow () для отображения копии изображения, прочитанного pyplot.imread (). Однако цвет остается тем же, когда я использую cv2.imshow () для отображения копии изображения, прочитанной cv2.imread (), и использую plt.imshow () для отображения копии, прочитанной plt.imread (). Мне просто любопытно и хотелось бы узнать о вещах, которые go за кадром, когда такие операции выполняются. Кто-нибудь может мне помочь с этим?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Предположим, у вас есть такой вектор: [0, 0, 255].

Вы знаете, что у вас есть две разные цветовые кодировки: RGB и BGR. Итак, в первом случае у вас есть Blue, во второй системе у вас есть Red.

Теперь давайте вызовем RGB_Reader и BGR_Reader для двух систем, чтобы открыть число и отобразить его.

Если я открою изображение с BGR_Reader, у меня есть [0, 0, 255]. Я передаю его в RGB_Reader, по-прежнему [0, 0, 255]. Я вижу синий. Когда я передаю его, я передаю [0, 0, 255]. Я снова открываю его с помощью RGB_Reader, он снова синий.

То же самое происходит и наоборот.

Имеет ли это для вас смысл? Вектор не меняется, но способ его декодирования меняется.

Теперь представим еще одну вещь, которая называется jpg_encoder. Тот говорит людям, куда поместить Blue, Red и Green, и, вероятно, будет переупорядочивать вещи.

1 голос
/ 03 апреля 2020

Это в основном зависит от цветового соглашения. OpenCV следует соглашению BGR, что означает, что он интерпретирует триплет (0, 150, 255) как значения B, G и R соответственно. И все остальные библиотеки следуют более очевидному соглашению RGB. Я полагаю, что причиной того, что OpenCV следует соглашению BGR, является наследие (возможно, с 1991 года).

Я бы порекомендовал вам использовать только методы OpenCV, такие как cv2.imread(), cv2.imshow() или cv2.imwrite(), et c. выполнять любые операции с изображениями. Поскольку при написании кода таким образом вам никогда не придется беспокоиться о базовых функциях BGR или RGB, все будет работать нормально.

Проблема может возникнуть, если вы захотите использовать OpenCV с matplotlib или pillow et c. В этих случаях вам необходимо проявлять особую осторожность при передаче матрицы изображений в соответствующие библиотеки. Так как OpenCV хранит данные в формате BGR, тогда как matplotlib или pillow ожидают формат RGB, поэтому вам явно нужно преобразовать порядок цветов, используя cv2.cvtColor(img, cv2.COLOR_BGR2RGB), или вы также можете использовать numpy срезы, чтобы поменять местами первый и третий каналы. также.

Вы можете обратиться к этому ответу для демонстрационного кода, который преобразует изображения OpenCV в изображения формата PIL (еще один python модуль обработки изображений).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...