[英]why cv2.imwrite() changes the color of pics?
您的问题在于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))
现在我们得到以下输出:
另一种方法是仅使用cv2.imread
使用cv2.imread
加载图像。 在这种情况下,我们仅使用 BGR 图像。
注意:不提供任何标志意味着默认使用cv2.IMREAD_COLOR
-- 即图像始终作为 3 通道图像加载(删除任何潜在的 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
与标志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.