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/Pillow、scikit-image、matplotlib、pyvips将图像存储在内存中的常规 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,反之亦然
python使用OpenCV加载图像为RGB图并可视化加载的图像(Convert to RGB and show image)