您的问题在于,skimage.io.imread
将图像加载为RGB(或RGBA),但OpenCV假定图像是BGR或BGRA(BGR是默认的OpenCV颜色格式)。这意味着蓝色和红色平面会被翻转。
让我们使用以下简单的测试图像进行尝试:
首先让我们尝试您原始的算法:
import skimage.io
import cv2
img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_1.png', img)
我们得到了以下结果:
如您所见,红色和蓝色通道明显被交换了。
第一种方法,假设您仍然想使用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))
现在我们获得以下输出:
另一种选择是只使用OpenCV -- 使用cv2.imread
来加载图像。在这种情况下,我们仅处理BGR图像。
NB: 不提供任何标志意味着默认使用cv2.IMREAD_COLOR
-- 即图像始终被加载为三通道图像(丢弃任何潜在的alpha通道)。
import cv2
img = cv2.imread('sample.png')
cv2.imwrite('sample_out_3.png', img)
根据您的截图,似乎您有一张4通道图像。这意味着在skimage中是RGBA,在OpenCV中是BGRA。原理类似。
cv2.COLOR_RGBA2BGRA
。cv2.IMREAD_UNCHANGED
的 cv2.imread
。cv2.imread
读取图片,但使用matplotlib
显示时,我发现这很有用。不过,我觉得奇怪的是opencv使用BGR。 - Lem Ko输入的图像(以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)
io.imread
是来自 skimage 的函数? - Dan Mašekskimage.io.imread
将图像加载为RGB格式,但是numpy假定图像为BGR,因此蓝色和红色平面会翻转。 为什么不直接使用cv2.imread
加载图像呢? - Dan Mašekcv2.imread
,它会以BGR格式读取(这是OpenCV的默认格式),或者使用cv2.cvtColor
将RGB转换为BGR。 - Dan Mašek