我在 Python 中有一个二进制图像,我想将它保存在我的电脑中。
一旦存储在我的计算机中,我需要它是一个 1 位深的 png 图像。
我怎样才能做到这一点?我尝试了 PIL 和 cv2,但我无法以 1 位深度保存它。
最佳答案
我发现自己处于一种需要创建大量二进制图像的情况,并且对在线可用信息感到沮丧。感谢这里和其他地方的答案和评论,我能够找到一个可以接受的解决方案。 @Jimbo 的评论是迄今为止最好的。下面是一些代码来重现我对在 python 中保存二进制图像的一些方法的探索:
加载库和数据:
from skimage import data, io, util #'0.16.2'
import matplotlib.pyplot as plt #'3.0.3'
import PIL #'6.2.1'
import cv2 #'4.1.1'
check = util.img_as_bool(data.checkerboard())
棋盘格图片来自
skimage
尺寸为 200x200。不压缩,作为1位图像应该用(200*200/8)5000字节表示用
skimage
保存, 注意如果数据不是 uint
包会报错,因此转换。保存图像平均需要 2.8 毫秒,文件大小为 408 字节io.imsave('bw_skimage.png',util.img_as_uint(check),plugin='pil',optimize=True,bits=1)
使用
matplotlib
, 4.2ms 和 693 字节文件大小plt.imsave('bw_mpl.png',check,cmap='gray')
使用
PIL
, 0.5 毫秒和 164 字节文件大小 img = PIL.Image.fromarray(check)
img.save('bw_pil.png',bits=1,optimize=True)
使用
cv2
,还提示一个 bool
输入。尽管使用 png 压缩,以下命令需要 0.4 毫秒并生成 2566 字节的文件大小..._ = cv2.imwrite('bw_cv2.png', check.astype(int), [cv2.IMWRITE_PNG_BILEVEL, 1])
PIL
显然是速度和文件大小的最佳选择。我当然错过了一些优化,欢迎评论!
关于python - 在 Python 中保存 1 位深的二进制图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50268092/