OpenCV Python:将图像读取为RGB

13

在使用Python的OpenCV读取图片时,是否可以将其默认读取为RGB顺序?在OpenCV文档中,imread方法返回BGR顺序的图像,但是在代码中imread方法返回RGB顺序的图像?我没有进行任何转换处理。只是使用了imread方法并在屏幕上显示。它在Windows图片查看器上显示。

编辑1: 我的代码如下。左侧是cv.imshow()方法,右侧是plt.imshow()方法。

cv2.imshow()方法显示的图像为RGB格式,而plt.imshow()方法显示的图像为OpenCV读取的(BGR)格式。

image_file = 'image/512-2-1001-18-RGB.jpg'
# img = imp.get_image(image_file)

img = cv2.imread(image_file)
plt.imshow(img)
plt.show()

cv2.imshow('asd', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里输入图片描述

编辑2: 不知何故,opencv的imshow方法将图像显示为RGB格式。 下面我附上了图像的第一个像素值和Photoshop像素值的比较。

在这里输入图片描述

在这里输入图片描述

编辑3: 下面是读取图像、imshow和原始RGB图像。

imshow方法后图像看起来与原始图像相同,这让我感到困惑。

在这里输入图片描述

按RGB顺序排列的原始图像。

在这里输入图片描述


3
我不知道有哪个配置标志可以传递给cv2.imread()函数,以便读取RGB格式的图像。我认为默认格式仅为BGR。在读取图像后,您始终可以使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)将图像转换为RGB格式。 - ZdaR
3
只需使用 RGB = cv2.imread('image.png')[...,::-1] - Mark Setchell
这是代码:def get_image(self, filePath): return cv.imread(filePath)。它会返回 RGB 图像(在屏幕上显示时,看起来就像在 Windows 图像查看器中一样)。 - S. Aziz Kazdal
1个回答

23

OpenCV在其内部是完全一致的。它将图像读入Numpy数组中,通道顺序为BGR,保持图像的BGR顺序,并且它的cv2.imshow()cv2.imwrite()也期望图像的BGR顺序。所有的JPEG/PNG/BMP/TIFF文件仍然按照它们在磁盘上的正常RGB顺序。

其他库,比如 PIL/Pillow, scikit-image, matplotlib, pyvips 在内存中以传统的RGB顺序存储图像。

因此,只有当你混合使用OpenCV和其他库时才会出现颜色问题。如果你要从任何其他库进入/退出OpenCV,你需要反转通道顺序。这个过程是相同的,无论哪种方式,都是交换第一个通道和第三个通道:

RGBimage = BGRimage[...,::-1]
或者
BGRimage = RGBimage[...,::-1]

或者,您可以使用 OpenCVcvtColor() 函数进行转换:

RGBimage = cv2.cvtColor(BGRimage, cv2.COLOR_BGR2RGB)

每次都不必完全复制一个新的变量。比如你用OpenCV读取了一张图片,OpenCV默认使用BGR顺序,并且你想简要地用matplotlib显示它,你只需在传递时反转通道:

# Load image with OpenCV and process in BGR order
im = cv2.imread(something)

# Briefly display with matplotlib, which will want RGB order
plt.imshow(img[...,::-1])
plt.show()

# Carry on processing in BGR order with OpenCV
...

一些问题或者我仍然无法理解opencv如何读取图像并显示它。添加了一些新的代码和屏幕截图。 - S. Aziz Kazdal
尝试使用OpenCV打开并显示这张红色图片,可以在我的另一个答案中找到 https://i.stack.imgur.com/ZR0sb.png 。如果使用OpenCV打开,它应该显示为红色。然后再使用OpenCV打开并使用matplotlib显示,它应该显示为蓝色。 - Mark Setchell
我尝试了一下,结果和你说的一样。我想我可能漏掉了什么 :)。原始图像是红色的,而opencv读取它时是BGR顺序。所以matplot会按照BGR顺序显示它,对吗?那么我应该期望看到opencv imshow方法将其显示为蓝色?BGR顺序? - S. Aziz Kazdal
1
图像是红色的。因此,所有红色圆圈都存储在磁盘文件的第一个通道中。当OpenCV读取它时,它将红色数据存储在第三个通道中,但这并不重要,因为当OpenCV显示它时,OpenCV显示函数期望红色信息在第三个通道中,所以它看起来是正确的。相比之下,matplotlib和PIL使用第一个通道加载具有红色内容的图像,并且它们的显示函数期望红色内容在第一个通道中。因此,只有当您使用与打开图像不同的软件包显示图像时才会出现问题。 - Mark Setchell
我现在明白了,我需要改变自己的思考方式 :) 因此,使用OpenCV读取图像时,会以自己的方式存储图像颜色,并且imshow和imwrite方法期望具有相同的颜色顺序。还有一件事,我还使用不同的颜色空间,如HSV,因此我需要在屏幕上查看HSV转换结果。首先读取图像并将其转换为HSV颜色空间cv.cvtColor(image, cv.COLOR_BGR2HSV),然后使用imshow方法。这些步骤是否能够产生正确的结果以查看HSV颜色空间图像? - S. Aziz Kazdal
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接