如何利用OpenCV读取,显示以及写入图片?
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用OpenCV读取,显示以及写入图片?相关的知识,希望对你有一定的参考价值。
简 介: 本文中,你了解了: imread(), imshow()以及imwrite()等函数用于图像的读取、显示和保存; waitKey(), destroyAllWindows()函数用于:对于waitKey()函数建议你多做些实验,因为它的某些特性比较容易让人搞混淆。 你对它越熟悉,你就能够更好的掌握它。对于文中的代码你可以拷贝粘贴下来进行实验。
关键词
: OpenCV,Image,imread,imwrite
§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()函数建议你多做些实验,因为它的某些特性比较容易让人搞混淆。 你对它越熟悉,你就能够更好的掌握它。对于文中的代码你可以拷贝粘贴下来进行实验。
■ 相关文献链接:
● 相关图表链接:
- 图1.1 本文所使用的样例图片
- 图2.1 读入、显示、关闭图片窗口
- 图2.2 使用imshow()显示图片
- 图2.3 使用imshow()显示的灰度图片
- 图2.4 读取图片是使用的参数 cv2.IMREAD_UNCHANGED
- 图2.5 在显示图片的过程中没有应用waitKey() 函数
以上是关于如何利用OpenCV读取,显示以及写入图片?的主要内容,如果未能解决你的问题,请参考以下文章