Save BGR image with cv2.imwrite
我有一个2D numpy数组,其值在[-4,3]之间浮动。
cv2.imshow将该数组显示为BGR图像,但是当我使用cv2.imwrite保存它时,它是完全黑色的。 然后,我发现必须将数组乘以255才能保存,但要使用imwrite进行保存,但是在这种情况下,图像以RGB格式保存,但是我想保存cv2.imshow显示的BGR图像。
我该怎么办?
-
实际上,所有图像格式都使用RGB排序。 您要使用哪种格式(文件扩展名)?
-
我将图像另存为PNG文件
-
PNG文件无法存储浮点数。 您可能需要TIFF或PFM。
-
另外,您保存的任何图像文件(PNG,BMP,GIF,JPG)中的排序都不重要,因为OpenCV会在读取或写入时即时对其进行转换。 该命令已标准化为RGB,因此其他应用程序可以正确解释您的图像。
-
浮点格式的图像的值必须在[0,1]范围内。 具有8位无符号的位必须在[0,255]范围内。 将[-4,3]范围内的值乘以255仍将为您提供无效的值(或更糟糕的是,导致溢出,完全破坏了数据。)
-
您可以使用np.save() docs.scipy.org/doc/numpy/reference/generated/numpy.save.html
首先,您必须调整所有数组的值。 像素在-4到3之间,因此您必须执行以下操作:
1 2
| img = img - min_val
img = img*255.0/(max_val - min_val) |
在您的情况下,它将是:
1 2
| img = img+4
img = img*255/7.0 |
然后将您的img转换为8位未inging的int并使用imwrite保存(无需与BGR或RGB混淆,opencv自行处理)
-
在尝试该方法之后,输出看起来像是matplotlib imsave。因此,此方法也类似于RGB格式(不是BGR)。谢谢
-
如果要用B代替R,请进行分割并获得3个单独的通道,然后以相反的顺序合并它们。
-
请注意,如果您尝试在大图像上保存从0..1到0..1的平滑斜坡(渐变),则此方法可能会导致"条带化",因为您只有8位分辨率。如果存在问题,则由于您正在使用PNG,因此可以通过将公式中的所有255更改为65,535并转换为16位无符号短时间来保存16位文件,然后再另存为PNG。
-
@Mark Stechell是的,当然,此方法会使一些数据丢失,但我提到了最简单的方法。他可以按照您所说的保存PNG或将原始数组另存为xml或txt文件。
因此,基本上,您要将图像从RGB转换为BGR图像。
这可以通过使用cv2.cvtColor()函数来完成。
1 2
| result_BGR = cv2.cvtColor(RGB_image, cv2.COLOR_RGB2BGR)
cv2.imwrite('PATH', result_BGR) |
-
我用这段代码做到了。 image = cv2.cvtColor(image.astype(float32),cv2.COLOR_BGR2RGB)cv2.imwrite(path,image * 255)但结果是相同的(保存为RGB !!!)
-
您正在使用cv2.COLOR_BGR2RGB将BGR图像转换为RGB。但是在这里,我们想将RGB转换为BGR。因此,您应该使用cv2.COLOR_RGB2BGR。再看看我的答案。它会帮助你。 :)
-
好吧,那是写作上的错误。我的代码是:image = cv2.cvtColor(image.astype(float32),cv2.COLOR_BGR2RGB)cv2.imwrite(path,image * 255)但图像仍然没有改变!