我正在尝试使用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”)。
以下是代码运行时生成的输出图像:
下面是保存的图像:
尽管上述两个图像表示同一张图片,但可以注意到它们略有不同。敏锐地观察两个图像的圆形边缘,表明它们是不同的。
答案 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.4
和1488/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))
设置图形大小,然后查看显示的图像本身会提高/降低质量。
希望这会有所帮助。