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

Sta*_*use 22 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])  
Run Code Online (Sandbox Code Playgroud)

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

这是current_img的值:

current_img的值

Dan*_*šek 52

您的问题在于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)
Run Code Online (Sandbox Code Playgroud)

我们得到以下结果:

结果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))    
Run Code Online (Sandbox Code Playgroud)

现在我们得到以下输出:

结果2


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

注意:cv2.IMREAD_COLOR默认情况下不使用任何标志装置- 即图像始终作为3通道图像加载(丢弃任何潜在的Alpha通道).

import cv2

img = cv2.imread('sample.png')
cv2.imwrite('sample_out_3.png', img)
Run Code Online (Sandbox Code Playgroud)

结果3


4频道图像

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

  • 使用颜色转换代码 cv2.COLOR_RGBA2BGRA
  • 或者使用cv2.imread旗帜cv2.IMREAD_UNCHANGED