opencv python将图像读取为RGB

Posted

技术标签:

【中文标题】opencv python将图像读取为RGB【英文标题】:opencv python reading image as RGB 【发布时间】:2020-08-13 10:37:05 【问题描述】:

是否可以将 opencv(使用 python)作为默认读取图像作为 RGB 顺序?在 opencv 文档中 imread 方法将图像作为 BGR 的顺序返回,但在代码中 imread 方法将图像作为 RGB 顺序返回?我没有做任何转换过程。只需使用 imread 方法并在屏幕上显示。它在 Windows 图像查看器上显示。 可能吗 ?

编辑 1: 我的代码如下。左侧 cv.imshow() 方法和另一个 plt.imshow() 方法。

cv2.imshow() 方法将图像显示为 RGB,plt 将其显示为 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顺序排列的原图。

【问题讨论】:

我不知道任何配置标志在传递给cv2.imread() 时会读取 RGB 格式的图像。我认为默认格式仅为 BGR。读取图片后随时可以使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)将图片转为RGB。 只要使用RGB = cv2.imread('image.png')[...,::-1] ` def get_image(self, filePath): return cv.imread(filePath)` 代码是这个并将图像作为RGB返回(当我在屏幕上显示它时,它看起来就像在Windows图像上一样查看器)。 【参考方案1】:

OpenCV 本身是完全一致的。它将图像读入 Numpy 数组,通道按 BGR 顺序排列,将图像保持在 BGR 顺序,其cv2.imshow()cv2.imwrite() 也期望图像按 BGR 顺序排列。您所有的 JPEG/PNG/BMP/TIFF 文件在磁​​盘上都保持正常的 RGB 顺序。

其他库,如PIL/Pillowscikit-imagema​​tplotlibpyvips将图像存储在内存中的常规 RGB 顺序。

因此,如果您将 OpenCV 与任何其他库混合使用,您只会遇到颜色问题。如果您从任何其他人前往/前往OpenCV,则需要颠倒频道顺序。无论哪种方式都是相同的过程,您正在交换第一个和第三个通道:

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

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

或者,您可以使用 OpenCV cvtColor() 进行转换:

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 如何读取图像并显示它。添加了一些新代码和屏幕截图 我正在使用这个 python 包。 link. 尝试拍摄红色图像,我的另一个答案在这里i.stack.imgur.com/ZR0sb.png 并打开它并使用 OpenCV 显示它应该显示为红色。然后用 OpenCV 打开它并用 matplotlib 显示,它应该显示为蓝色。 我试过了,果然如你所说。我想我错过了一些东西:)。原始图像是红色的,opencv 将其读取为 BGR 顺序。所以 matplot 将其显示为 BGR 订单对吗?我应该期望看到 opencv imshow 方法将其显示为蓝色吗? BGR 订单? 图像为红色。所以所有的红色圆圈都存储在磁盘文件的第一个通道中。当 OpenCV 读取它时,它会将红色数据存储在第三个通道中,但这并不重要,因为当 OpenCV 显示它时,OpenCV 显示函数期望红色信息在第三个通道中,因此它看起来是正确的。相比之下,matplotlib 和 PIL 在第一个通道中加载带有红色内容的图像,并且它们的显示函数期望红色内容在第一个通道中。因此,只有当您显示的图像与您打开的包不同时才会出现问题。

以上是关于opencv python将图像读取为RGB的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 将 RGB 图像转换为 LMS,反之亦然

opencv读图片灰度值

python使用OpenCV加载图像为RGB图并可视化加载的图像(Convert to RGB and show image)

python+opencv2怎么将图像像素值转换为float64用于后续计算

opencv 提取单通道 ,转化灰度图像。

如何在OpenCV中使用Adobe RGB色彩空间读取jpeg图像?