【问题标题】:How to save grayscale image in Python?如何在 Python 中保存灰度图像?
【发布时间】:2019-05-28 04:55:20
【问题描述】:

我正在尝试使用 matplotlib savefig() 保存灰度图像。我发现使用 matplotlib savefig() 后保存的 png 文件与代码运行时显示的输出图像有点不同。代码运行时生成的输出图像包含比保存的图形更多的细节。

如何以所有细节都存储在输出图像中的方式保存输出图?

我的代码如下:

import cv2
import matplotlib.pyplot as plt

plt.figure(1)
img_DR = cv2.imread(‘image.tif',0)
edges_DR = cv2.Canny(img_DR,20,40)
plt.imshow(edges_DR,cmap = 'gray')
plt.savefig('DR.png')
plt.show()

输入文件(‘image.tif’)可以从here找到。

以下是代码运行时生成的输出图像:

下面是保存的图片:

虽然上述两张图片表示同一张图片,但可以注意到它们略有不同。仔细观察这两个图像的圆形外围可以看出它们是不同的。

【问题讨论】:

    标签: python opencv matplotlib image-processing


    【解决方案1】:

    将实际图像保存到文件,而不是图形。图形与您处理的实际创建的图像之间的 DPI 会有所不同。由于您使用的是 OpenCV,请使用 cv2.imwrite。在你的情况下:

    cv2.imwrite('DR.png', edges_DR)
    

    使用 PNG 格式,因为 JPEG 是有损的,因此会降低质量以促进较小的文件大小。如果准确性是这里的关键,请使用无损压缩标准,PNG 就是一个例子。


    如果你以某种方式反对使用 OpenCV,Matplotlib 有一个等效的图像写入方法,称为 imsave,其语法与 cv2.imwrite 相同:

    plt.imsave('DR.png', edges_DR, cmap='gray')
    

    请注意,我将imsave 的颜色映射强制为灰度,因为它不会像 OpenCV 如何将图像写入文件那样自动推断。

    【讨论】:

      【解决方案2】:

      既然您使用 cv2 来加载图像,为什么不也使用它来保存它。 我认为您正在寻找的命令是:

      cv2.imwrite('gray.jpg', gray_image)

      【讨论】:

        【解决方案3】:

        使用与图像大小相匹配的 DPI 似乎会有所作为。

        图像的大小为 width=2240 和 height=1488 (img_DR.shape)。使用fig.get_size_inches() 我看到以英寸为单位的图像大小是array([7.24, 5.34])。因此,自2240/7.24=309.41488/5.34=278.65 以来,适当的dpi 约为310。

        现在我做plt.savefig('DR.png', dpi=310) 并得到

        要做的一个实验是选择足够高的 DPI,以英寸为单位计算图形的高度和宽度,例如 width_inch = width_pixel/DPI 并使用 plt.figure(figsize=(width_inch, height_inch)) 设置图形大小,然后查看显示的图像本身是否会增加/减少在质量上。

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-06
          • 1970-01-01
          • 2022-11-15
          • 2020-12-24
          • 2015-06-24
          • 1970-01-01
          • 1970-01-01
          • 2012-08-25
          相关资源
          最近更新 更多