如何在Python中保存灰度图像?

时间:2019-05-28 04:55:20

标签: python opencv matplotlib image-processing

我正在尝试使用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()

可以从here中找到输入文件(“ image.tif”)。

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

enter image description here

下面是保存的图像:

enter image description here

尽管上述两个图像表示同一张图片,但可以注意到它们略有不同。敏锐地观察两个图像的圆形边缘,表明它们是不同的。

3 个答案:

答案 0 :(得分:5)

将实际图像保存到文件而不是图形。图形与您根据处理实际创建的图像之间的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如何将图像写入文件那样自动推断出来。

答案 1 :(得分:3)

由于您正在使用cv2加载图像,所以为什么不同时使用它来保存图像。 我认为您正在寻找的命令是:

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

答案 2 :(得分:1)

使用与图像大小匹配的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=310 image

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

希望这会有所帮助。