简介
OpenCV的cv2.imwrite()函数是一个非常常见的将图像保存到文件的函数。然而,cv2.imwrite函数的许多特性并不为许多人所知。在这篇文章中,我们将给你详细解释cv2.imwrite()的语法和功能,并附有实例。
OpenCV cv2.imwrite()函数的语法
cv2.imwrite()的语法如下
cv2.imwrite(filename, img[, params])
参数
- filename -需要保存图像的文件名。文件名的扩展名决定了图像的格式。例如,filname.jpeg将以jpeg格式保存图像,filename.png将以png格式保存图像。
- image -要保存的图像
- params -这是可选的,根据文件格式有参数,解释如下:
对于JPEG文件格式,支持的参数是cv2.IMWRITE_JPEG_QUALITY,可能的值是0到100,默认值是95。更高的值会产生一个质量更好的图像文件。
对于PNG文件格式,支持的参数是cv2.IMWRITE_PNG_COMPRESSION,可能的值是0到9,默认值是3。较高的值会对图像进行高度压缩,导致文件大小变小,但压缩时间变长。
对于PPM、PGM或PBM文件格式,支持的参数是二进制格式标志cv2.IMWRITE_PXM_BINARY,其值可能是0或1。默认值是1。
用cv2 imwrite将图像保存为不同的文件格式
让我们看看cv2 imwrite以不同的文件格式保存图像的不同例子。
图像实例
为了使例子简单,我们将从一个文件中读取下面的图像,然后用cv2.imwrite()以不同的文件格式再次保存它。

打印文件大小的辅助函数
下面的函数将有助于打印图像的文件大小,我们将在所有的例子中使用它。
在[0]中:
def print_file_size(file):
File_Size = os.path.getsize(file)
File_Size_MB = round(File_Size/1024/1024,2)
print("Image File Size is " + str(File_Size_MB) + "MB" )
读取图像
让我们从文件中读取图像样本并打印文件大小。
在[1]中:
#read image
img=cv2.imread("parrot.jpg")
print_file_size("parrot.jpg")
输出[1]:
Image File Size is 2.89MB
将图像保存为JPEG格式的文件
让我们把图像存回JPEG文件。图像保存成功了,但你是否注意到,尽管我们读取了JPEG文件,然后用JPEG格式写回了图像,但文件大小却从2.89MB减少到1.2MB?
这是因为cv2.imwrite()有能力在将图像写入文件时对其进行压缩。我们将在后面的章节中进一步探讨这个问题。
In[2]:
cv2.imwrite("parrot_saved.jpg", img)
print("Image Saved Successfully!!")
print_file_size("parrot_saved.jpg")
Out[2]:
Image Saved Successfully!!
Image File Size is 1.2MB
将图像以PNG格式保存到文件中
接下来,让我们把文件保存为png文件格式。这一次,文件大小增加了,因为cv2.write函数不只是为命名者创建了一个.png文件,它实际上是将图像保存为png格式,导致文件大小高于原始jpeg。
In[3]:
cv2.imwrite("parrot_saved.png", img)
print("Image Saved Successfully!!")
print_file_size("parrot_saved.png")
Out[3]:
Image Saved Successfully!!
Image File Size is 7.25MB
将图像保存为TIFF格式的文件
这一次,让我们把文件保存为tiff格式,如下图所示。
In [4]:
cv2.imwrite("parrot_saved.tiff", img)
print("Image Saved Successfully!!")
print_file_size("parrot_saved.tiff")
Out[4]:
Image Saved Successfully!!
Image File Size is 7.19MB
在cv2 imwrite中管理JPEG图像质量
通过cv2.imwrite(),图像质量可以通过cv2.IMWRITE_JPEG_QUALITY参数和它的值来控制。这个值可以在0到100之间,其中100产生最高质量,0产生最低质量。
默认情况下,cv2.imwrite()假定cv2.IMWRITE_JPEG_QUALITY的值为95。这就是为什么在我们上面的第一个例子中jpeg图像的文件大小减少了,因为它降低了图像质量。
让我们通过明确提到cv2.IMWRITE_JPEG_QUALITY参数值为100来保存同一图像为JPEG格式。这一次可以看到,现在的文件大小与原始图像文件相同。
In[5]:
cv2.imwrite("parrot_saved.jpg", img, [cv2.IMWRITE_JPEG_QUALITY, 100])
print("Image Saved Successfully!!")
print_file_size("parrot_saved.jpg")
Out[5]:
Image Saved Successfully!!
Image File Size is 2.89MB
为了好玩,让我们把cv2.IMWRITE_JPEG_QUALITY的值传成0,即用最低的质量。
正如你在输出中看到的,图像质量明显很低。
In[6]:
cv2.imwrite("parrot_saved.jpg", img, [cv2.IMWRITE_JPEG_QUALITY, 0])
print("Image Saved Successfully!!")
print_file_size("parrot_saved.jpg")
Out[6]:
Image Saved Successfully!!
Image File Size is 0.09MB
输出文件中的图像:

在cv2中管理PNG图像压缩 imwrite
通过cv2.imwrite()可以用cv2.IMWRITE_PNG_COMPRESSION 参数和它的值来控制PNG图像的压缩。 这个值可以在0到9之间,其中9产生最高的压缩率,有更多的时间来保存图像到文件中。默认值是3。
让我们明确传递cv2.IMWRITE_PNG_COMPRESSION的值为0,即不压缩。结果文件大小为17.2 MB
In[7]:
cv2.imwrite("parrot_saved.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION),0])
print("Image Saved Successfully!!")
print_file_size("parrot_saved.png")
输出[7]:
Image Saved Successfully!!
Image File Size is 17.2MB
接下来,让我们通过将cv2.IMWRITE_PNG_COMPRESSION的值设为9,以最高的压缩率将图片保存为png格式。
In[8]:
cv2.imwrite("parrot_saved.png", img, [int(cv2.IMWRITE_PNG_COMPRESSION),9])
print("Image Saved Successfully!!")
print_file_size("parrot_saved.png")
输出[8]:
Image Saved Successfully!!
Image File Size is 6.33MB
总结
总结一下,OpenCV cv2的imwrite函数可以用于以下使用情况
- 将numpy.ndarray格式的图像写入一个物理文件中。
- 文件的扩展名决定了该文件将以何种格式保存。因此,cv2 imwrite也可以用来将图像从一种格式转换为另一种格式。
- 还可以用cv2.imwrite函数控制jpeg图像质量和png图像压缩。