Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV-imshow不';不需要从BGR转换为RGB_Python_Opencv - Fatal编程技术网

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

Python OpenCV-imshow不';不需要从BGR转换为RGB,python,opencv,Python,Opencv,据我所知,OpenCV以BGR颜色空间顺序读取图像,我们通常必须将其转换回RGB,如下所示: img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 但当我尝试简单地读取图像并显示它时,颜色似乎很好(无需将BGR转换为RGB): 因此,imshow()是自动更改函数内的顺序(从BGR到RGB)还是一直都是BGR的顺序?BGR和RGB不是颜色空间,它们只是不同颜色通道顺序的约定cv2.cvtColor(img,cv2.COLOR\u BGR2RGB)不做任何计算(比

据我所知,OpenCV以BGR颜色空间顺序读取图像,我们通常必须将其转换回RGB,如下所示:

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
但当我尝试简单地读取图像并显示它时,颜色似乎很好(无需将BGR转换为RGB):


因此,
imshow()
是自动更改函数内的顺序(从BGR到RGB)还是一直都是BGR的顺序?

BGR和RGB不是颜色空间,它们只是不同颜色通道顺序的约定
cv2.cvtColor(img,cv2.COLOR\u BGR2RGB)
不做任何计算(比如说HSV会进行转换),它只是围绕顺序进行切换。任何顺序都是有效的——实际上,三个值(红色、绿色和蓝色)叠加在一起形成一个像素。你可以按照你喜欢的方式安排它们,只要你告诉显示器你给了它什么顺序

OpenCV
imread
imwrite
imshow
确实都使用BGR顺序,因此当您使用
cv2.imread
读取图像,然后希望使用
cv2.imshow
显示图像时,无需更改顺序

虽然BGR在整个OpenCV中使用一致,但大多数其他图像处理库都使用RGB排序。如果要使用
matplotlib
imshow
但要使用OpenCV读取图像,则需要将BGR转换为RGB

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

此单行代码将rgb更改为bgr

如果您不需要使用任何其他图像处理库(例如Matplotlib的imshow),则无需进行颜色比例转换。下面的代码是一个示例,其中完成了色阶转换,但当加载图像时,它仍然加载在BGR中。由于使用cv2.imshow()显示图像,因此不需要进行此转换

导入cv2
#阅读图片#
图像=cv2.imread(“”)
image\u rgb=cv2.cvt颜色(image,cv2.COLOR\u BGR2RGB)
#写一个函数在图像上画圆圈#
def draw_圆(事件、x、y、标志、参数):
如果event==cv2.event\u RBUTTONDOWN:
cv2.圆(img=图像_rgb,中心=(x,y),半径=100,颜色=(0,0255),厚度=10)
#打开CV回调#
cv2.namedWindow(winname='ImageWindow')
cv2.setMouseCallback('ImageWindow',画圈)
#显示图像,直到用户按下ESC键#
尽管如此:
cv2.imshow('ImageWindow',图像\u rgb)
如果cv2.waitKey(20)&0xFF==27:
打破
cv2.destroyAllWindows()

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

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

[旁白:当然,如果你想使用
matplotlib
imshow
,你需要转换..]我做了一个实验:我只使用Open cv来imread和imshow,但使用Image=cv2.cvtColor(Image,cv2.COLOR\u BGR2RGB)图像变成蓝色(BGR).我不明白!艾博迪能解释吗??
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()

opencv_image_with_bgr_channels = cv2.imread('path/to/color_image.jpg')

matplotlib_compatible_image_with_rgb_channels = opencv_image_with_bgr_channels[:,:, ::-1]