#python #opencv
Вопрос:
Как я полагаю, 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 при переходе в/из OpenCV и других инструментов, использующих порядок RGB. OpenCV в некотором роде странный. Большинство других инструментов и форматов расположены в порядке RGB. При сохранении из OpenCV в стандартные форматы изображений OpenCV выполняет преобразование автоматически. Но при переходе туда и обратно в matplotlib, PIL или skimage вам может потребоваться сначала преобразовать в формат RGB в зависимости от того, что вы хотите сделать в этих других пакетах и собираетесь ли вы вернуться в OpenCV.
Ответ №1:
BGR и RGB не являются цветовыми пространствами, это просто условные обозначения порядка расположения различных цветовых каналов. cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
не выполняет никаких вычислений (например, преобразование, чтобы сказать, что HSV будет), он просто переключается по порядку. Любой порядок будет действителен — на самом деле три значения (красное, зеленое и синее) складываются в один пиксель. Вы можете расположить их так, как вам нравится, при условии, что вы сообщите дисплею, какой заказ вы ему отдали.
OpenCV imread
imwrite
и imshow
действительно все работают с порядком BGR , поэтому нет необходимости изменять порядок, когда вы читаете изображение, cv2.imread
а затем хотите его показать cv2.imshow
.
В то время как BGR последовательно используется в OpenCV, большинство других библиотек обработки изображений используют порядок RGB. Если вы хотите использовать matplotlib
s imshow
, но читать изображение с помощью OpenCV, вам нужно будет преобразовать BGR в RGB.
Комментарии:
1. [В стороне: Конечно , если бы вы хотели использовать
matplotlib
simshow
, вам нужно было бы конвертировать..]2. Я провел эксперимент: Я использовал только Open cv для imread и imshow,но использовал image=cv2.cvtColor(изображение, cv2.COLOR_BGR2RGB) Изображение стало синим(BGR). Я не могу понять! Может ли кто-нибудь объяснить??
Ответ №2:
screen = cv2.cvtColor(screen, cv2.COLOR_RGB2BGR)
этот код в одной строке изменяет rgb на bgr
Ответ №3:
opencv_image_with_bgr_channels = cv2.imread('path/to/color_image.jpg')
matplotlib_compatible_image_with_rgb_channels = opencv_image_with_bgr_channels[:,:, ::-1]
Это преобразует изображение BGR в изображение каналов RGB путем реверсирования каналов.
Ответ №4:
для matplotlib нам нужно изменить BGR на RGB:
img = cv2.imread("image_name")
img = img[...,::-1]
plt.imshow(img)
Ответ №5:
Если вам не нужно использовать какую-либо другую библиотеку обработки изображений (например, imshow Matplotlib), нет необходимости выполнять преобразование цветовой шкалы. Ниже приведен пример кода, в котором выполняется преобразование цветовой шкалы, но при загрузке изображения оно все еще загружается в BGR. Это преобразование не требуется, так как изображение отображается с помощью cv2.imshow().
import cv2
# read the image #
image = cv2.imread('<<Image Path>>')
image_rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
# write a function to draw circles on the image #
def draw_circle(event,x,y,flags,params):
if event == cv2.EVENT_RBUTTONDOWN:
cv2.circle(img=image_rgb,center=(x,y),radius=100,color=(0,0,255),thickness=10)
# Open CV callbacks #
cv2.namedWindow(winname='ImageWindow')
cv2.setMouseCallback('ImageWindow',draw_circle)
# display the image till the user hits the ESC key #
while True:
cv2.imshow('ImageWindow',image_rgb)
if cv2.waitKey(20) amp; 0xFF == 27:
break
cv2.destroyAllWindows()
Ответ №6:
В качестве альтернативы вы можете использовать функцию imutils.opencv2matplotlib (), для которой не требуется преобразование BGR в RGB.