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

2024-09-28 21:48:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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,保存后蓝色图片变为黄色。似乎有一条通道被废弃了。我真的不知道为什么。

以下是当前值:

value of current_img


Tags: 代码iohomeimgpngcurrentcv2glob
1条回答
网友
1楼 · 发布于 2024-09-28 21:48:00

问题在于^{}将图像加载为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

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


第一种方法是,假设您仍然希望使用skipage读取和cv2写入,则使用^{}将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——使用^{}加载图像。在这种情况下,我们只处理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在skipage中,BGRA在OpenCV中。原则是相似的。

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

相关问题 更多 >