python - 在 Python 中保存 1 位深的二进制图像

标签 python image binary computer-vision png

我在 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/

相关文章:

Java:在 Graphics 中使用 setClip 会更有效率吗?

visual-studio - 如何将数字签名应用于 Visual Studio 项目?

python - 如何在 web.py 中上传图片并将其保存到磁盘

python - 如何延迟在 __init__ 中传递的 python 表达式的求值

python - 如何在 Windows 命令行中运行 .py 文件?

python - 列名和相应的数据在 python 中不匹配

c# - Xamarin 表格 : Left Side Outline Border on image

java - 内部类 JPanel 的奇怪之处

python - 有优化这个算法的想法吗?

python - 从二进制文件中解压 double 值