OpenCV cv2.imwrite()的技巧和窍门

4,670 阅读4分钟

简介

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()以不同的文件格式再次保存它。

cv2 imwrite example

打印文件大小的辅助函数

下面的函数将有助于打印图像的文件大小,我们将在所有的例子中使用它。

在[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 imwrite example of cv2.IMWRITE_JPEG_QUALITY

在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图像压缩。