如何利用OpenCV读取,显示以及写入图片?

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用OpenCV读取,显示以及写入图片?相关的知识,希望对你有一定的参考价值。

简 介: 本文中,你了解了: imread(), imshow()以及imwrite()等函数用于图像的读取、显示和保存; waitKey(), destroyAllWindows()函数用于:对于waitKey()函数建议你多做些实验,因为它的某些特性比较容易让人搞混淆。 你对它越熟悉,你就能够更好的掌握它。对于文中的代码你可以拷贝粘贴下来进行实验。

关键词 OpenCVImageimreadimwrite

前 言 目 录
Contents
读取图像 显示图像 图像写入 总 结

 

§00   言

本文来自于Read, Display and Write an Image using OpenCV ,对于应用OpenCV完成图片的读取、显示和写入。

  对于图片读取、显示和写入文件是图像处理和计算机视觉最基本的操作过程。甚至在对于图片进行截取、缩放、旋转以及利用各种滤波器进行处理,你所要做的第一件事情就是从文件中将图片读取到计算机内存。所以掌握这项基本的操作非常重要。

  OpenCV,作为世界上最大的计算机视觉库,利用内置的三个函数来完成这些操作。它们分别是:

  1. imread() 读取图像;
  2. imshow() 显示图像;
  3. imwrite() 将图像写入文件;

  下面是本文所使用的样例图片。

▲ 图1.1 本文所使用的样例图片

  首先,下面的代码读取上述文件,并进行显示。查看代码是如何包含上述三条函数的。继续往下处理我们将对应用在代码中的每个函数进行讨论。

# import the cv2 library
import cv2

# The function cv2.imread() is used to read an image.
img_grayscale = cv2.imread('test.jpg',0)

# The function cv2.imshow() is used to display an image in a window.
cv2.imshow('graycsale image',img_grayscale)

# waitKey() waits for a key press to close the window and 0 specifies indefinite loop
cv2.waitKey(0)

# cv2.destroyAllWindows() simply destroys all the windows we created.
cv2.destroyAllWindows()

# The function cv2.imwrite() is used to write an image.
cv2.imwrite('grayscale.jpg',img_grayscale)

 

§01 取图像


  取图片,应用OpenCV中的imread()函数。下面函数调用语法:

imread(filename, flags)

  它需要了两个参数:
  1. 第一个参数为图像文件名称,需要文件的全路径名称。
  2. 第二个参数说明图片如何表示。OpenCV提供了几个对于图片数据表示的方式,下面三个是最常用的:
* cv2.IMREAD_UNCHANGED or -1
* cv2.IMREAD_GRAYSCALE or 0
* cv2.IMREAD_COLOR or 1

  函数缺省的flags的参数为1,也就是将读取的图片表示成彩色图像。你可以使用不同的flags参数来将读取的图片数据表示成特殊的格式。下面我们测试一下不同的 flags选项所产生的效果。

  在这里需要强调一下,OpenCV表示彩色图片使用的为BGR格式,而大多数其他计算机视觉库则使用的RGB格式表示。所以在使用OpenCV配合替他工具包使用的时候,不要忘记将蓝色与红色通道进行交换,这样才能够切换到其它图像处理库。

  下面的代码中,我们首先读取了测试图像,测试上面三种flags选项E对应的情况。

# Read an image
img_color = cv2.imread('test.jpg',cv2.IMREAD_COLOR)
img_grayscale = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE)
img_unchanged = cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)

或者

img_color = cv2.imread('test.jpg',1)
img_grayscale = cv2.imread('test.jpg',0)
img_unchanged = cv2.imread('test.jpg',-1)

 

§02 示图像


  OpenCV中,使用imshow()函数来显示图像。调用语法为:

imshow(window_name, image)

  这个函数也需要两个参数:
  1. 第一个参数是显示图片窗口的名称;
  2. 第二个参数就是需要显示的图片数据;

  如果显示多个图片,你需要为每个图片显示的窗口指定新的窗口名称。

  函数 imshow()通常与 waitKey()、distroyAllWindow()/distroyWindow() 函数联合使用。

  函数 waitKey() 用于绑定键盘:

  • 它带有一个数字参数,指明窗口显示的时间(单位ms);
  • 在等待时间内,用户输入任何字符,程序将会立即往下进行;
  • 如果等待参数为0,程序将会无限期等待用户的输入字符;
  • 你也可以设定该函数检测特殊的按键操作,比如Q键,或者 ESC键。然后显示每个案件特殊的行为;

  函数 distroyAllWindows() 将所有显示图片所创建的窗口关闭。如果想关闭某个窗口,则需要将该窗口的名称指定。使用 distroyAllWindows() 也将窗口和图片从计算机内存清除。下面的代码演示了函数 imshow()的是如何被用于显示你读入的图片的。

#Displays image inside a window
cv2.imshow('color image',img_color)  
cv2.imshow('grayscale image',img_grayscale)
cv2.imshow('unchanged image',img_unchanged)

# Waits for a keystroke
cv2.waitKey(0)  

# Destroys all the windows created
cv2.destroyAllwindows() 

  下面动图显示了整个对于图片的读入、显示、关闭显示窗口的整个过程。

▲ 图2.1 读入、显示、关闭图片窗口

  在下面三个输出屏幕中,你可以看到:
  1. 第一个图片显示为彩色;
  2. 接下来是灰度图片;
  3. 第三个是图片的原始格式,在读取的时候使用参数: cv2.IMREAD_UNCHANGED

▲ 图2.2 使用imshow()显示图片

▲ 图2.3 使用imshow()显示的灰度图片

▲ 图2.4 读取图片是使用的参数 cv2.IMREAD_UNCHANGED

  下面的动图显示了在读取、显示图片过程中没有应用waitKey()函数。用于图片显示的窗口在几个毫秒内就关闭了,所以在屏幕上并没有留下图片窗口。

▲ 图2.5 在显示图片的过程中没有应用waitKey() 函数

 

§03 像写入


  后,我们来讨论一下如何把一个图像写入、保存在文件目录中。所使用的函数为 imwrite(),它的语法为:

imwrite(filename, image)

  1. 第一个参数为文件名称,这个文件名称必须包含文件的扩展名,比如 .png,.jpg 等等。OpenCV就是根据文件名称的扩展名来确定保存文件的格式的。
  2. 第二个参数就是你所要保存的图像数据。 如果图片成功保存在目录中的文件,函数返回True。

  下面的代码显示了保存的过程,这个存盘的过程是很简单的。只是将带有正确扩展名称的文件名输入正确(带有想要保存路径名称),并且将图像数据变量输入,你就完成了图片的存储。

cv2.imwrite('grayscale.jpg',img_grayscale)

 

  结 ※


  文中,你了解了:

  • imread(), imshow()以及imwrite()等函数用于图像的读取、显示和保存;
  • waitKey(), destroyAllWindows()函数用于:
    • 在键盘操作之后关闭显示图像的窗口;
    • 将图像数据和窗口从内存清除。

  对于waitKey()函数建议你多做些实验,因为它的某些特性比较容易让人搞混淆。 你对它越熟悉,你就能够更好的掌握它。对于文中的代码你可以拷贝粘贴下来进行实验。


■ 相关文献链接:

● 相关图表链接:

以上是关于如何利用OpenCV读取,显示以及写入图片?的主要内容,如果未能解决你的问题,请参考以下文章

opencv读取图片通道以及显示

SLAM数据集序列图片如何批量处理

Python+OpenCV图像处理——读取显示一张图片

从0-1轻松入门 OpenCV4

opencv如何批量读取文件夹中图片

使用opencv调用24*24点阵字库和8*16ASCII字库在图片显示文字数字