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

时间:2017-02-23 03:16:14

标签: python opencv opencv3.0

我有以下代码:

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的值:

value of current_img

2 个答案:

答案 0 :(得分:43)

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

3频道图片

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

Input image

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

import skimage.io
import cv2

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

我们得到以下结果:

Result 1

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

第一种方法,假设您仍想使用skimage进行读取,使用cv2进行编写,则使用cv2.cvtColor将RGB转换为BGR。

由于新的OpenCV文档没有提及Python语法,在这种情况下您也可以使用appropriate reference for 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))    

现在我们得到以下输出:

Result 2

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

NB:不提供任何标记意味着默认使用cv2.IMREAD_COLOR - 即图像始终作为3通道图像加载(丢弃任何潜在的Alpha通道)。

import cv2

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

Result 3

4频道图片

从屏幕截图中可以看出,您有一个4通道图像。这将意味着在滑雪中的RGBA和在OpenCV中的BGRA。原则类似。

  • 使用颜色转换代码cv2.COLOR_RGBA2BGRA
  • 或使用带有cv2.imread
  • 标志的cv2.IMREAD_UNCHANGED

答案 1 :(得分:1)

输入的图像(以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)