Python OpenCV-imshow不需要从BGR转换为RGB

时间:2018-06-21 07:57:48

标签: python opencv

我相信,OpenCV会读取BGR色彩空间中的图像,我们通常必须像这样将其转换回RGB:

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

但是当我尝试简单地读取图像并将其显示时,着色看起来很好(无需将BGR转换为RGB):

img = cv2.imread(image_path)
cv2.imshow('BGR Image',img)
new_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imshow('BGR Image',new_img )
cv2.waitkey(0)

那么imshow()是自动在函数中更改色彩空间(从BGR到RGB)还是一直是BGR?

5 个答案:

答案 0 :(得分:10)

BGR和RGB不是颜色空间,它们只是不同颜色通道顺序的约定。 cv2.cvtColor(img, cv2.COLOR_BGR2RGB)不执行任何计算(例如说HSV的转换),它只是在顺序之间切换。任何排序都是有效的-实际上,三个值(红色,绿色和蓝色)堆叠在一起形成一个像素。您可以按照自己喜欢的方式安排它们,只要告诉显示器您给它指定了什么顺序即可。

OpenCV imreadimwriteimshow实际上都可以使用BGR顺序,因此当您使用cv2.imread和然后想用cv2.imshow来显示它。

虽然在整个OpenCV中始终使用BGR,但大多数其他图像处理库都使用RGB排序。如果要使用matplotlib的{​​{1}},但要使用OpenCV读取图像,则需要从BGR转换为RGB。

答案 1 :(得分:0)

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

这一行代码将rgb更改为bgr

答案 2 :(得分:-1)

如果不需要使用任何其他图像处理库(例如Matplotlib的imshow),则无需进行色标转换。下面的代码是一个示例,其中完成了色阶转换,但是在加载图像时,图像仍以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) & 0xFF == 27:
        break
        
cv2.destroyAllWindows()

答案 3 :(得分:-1)

或者,您可以使用imutils.opencv2matplotlib()函数,该函数不需要从BGR到RGB的转换。

答案 4 :(得分:-1)

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 通道图像。