繁体   English   中英

为什么 cv2.imwrite() 会改变图片的颜色?

[英]why cv2.imwrite() changes the color of pics?

我有以下一段代码:

imgs = glob.glob('/home/chipin/heart/tray.png')
current_img = io.imread(imgs[0])
cv2.imwrite('/home/chipin/heart/01.png', current_img[0:511,0:511])  

图片大小为512*512,保存后蓝色图片变为黄色。 似乎放弃了一个频道。 我真的不知道为什么。

这是 current_img 的值:

current_img 的值

您的问题在于skimage.io.imread将图像加载为 RGB(或 RGBA),但 OpenCV 假定图像为BGR 或 BGRA (BGR 是默认的 OpenCV 颜色格式)。 这意味着蓝色和红色平面被翻转。


3 通道图像

让我们用以下简单的测试图像来试试这个:

输入图像


首先让我们试试你的原始算法:

import skimage.io
import cv2

img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_1.png', img)

我们得到以下结果:

结果 1

如您所见,红色和蓝色通道明显交换。


第一种方法,假设您仍然希望使用 skimage 读取和 cv2 写入,则使用cv2.cvtColor将 RGB 转换为 BGR。

由于新的 OpenCV 文档没有提到 Python 语法,在这种情况下,您还可以使用2.4.x适当参考

import skimage.io
import cv2

img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_2.png', cv2.cvtColor(img, cv2.COLOR_RGB2BGR))    

现在我们得到以下输出:

结果 2


另一种方法是仅使用cv2.imread使用cv2.imread加载图像。 在这种情况下,我们仅使用 BGR 图像。

注意:不提供任何标志意味着默认使用cv2.IMREAD_COLOR -- 即图像始终作为 3 通道图像加载(删除任何潜在的 alpha 通道)。

import cv2

img = cv2.imread('sample.png')
cv2.imwrite('sample_out_3.png', img)

结果 3


4 通道图像

从您的屏幕截图来看,您似乎有一张 4 通道图像。 这意味着 skimage 中的 RGBA 和 OpenCV 中的 BGRA。 原则是相似的。

  • 要么使用颜色转换代码cv2.COLOR_RGBA2BGRA
  • 或者使用cv2.imread与标志cv2.IMREAD_UNCHANGED

输入上的图像(作为 png)按 RGB 顺序排列,但内存中的图像(作为 cv::Mat)按 BGR 顺序排列。 使用cv2.imread()作为输入。 因此, imread() 将在内部从 rgb 转换为 bgr 而 imwrite() 将执行相反的操作,所有这些都在幕后。

这是你如何做到的:

current_img = cv2.imread('/home/chipin/heart/tray.png')
cv2.imwrite('/home/chipin/heart/01.png', current_img)  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM