本篇文章,将学习如何读取图像、如何显示图像以及如何保存图像。这是学习OpenCV最基本的问题。
主要是学习几个函数的使用,这几个函数在今后的学习中经常用到。
环境:Windows XP(X86) Python 3.4 OpenCV3.1.0
一、图像的读取
图像的读取主要函数是cv2.imread()。
通过上篇文章中介绍的在线帮助文档,在其中搜索到imread函数,即可知道该函数的详细介绍。如下:
Mat cv::imread (const String & filename, int flags = IMREAD_COLOR)
功能:读取图片文件。
参数:
参数一是文件名,在单引号中填读取图像文件的文件名。
注意:当只填写文件名时,图像文件需要和Python程序文件放在同一文件夹下,否则会出错,如果想不放在一起,可以填写绝对路径,如‘E:\CSDN写博客资料\python_opencv入门学习\一、图像的读取、显示、保存\russia2018.jpg’,这可能会出现错误,问题出在 反斜杠\ 上,解决方法是改为正斜杠/即可。OpenCV支持的图片格式如下(仅列举常见的格式):
windows位图:后缀名为bmp
JPEG文件:后缀名为jpeg/jpg
JPEG2000:后缀名为jp2
便携式网络图像文件:后缀名为png
TIFF文件:后缀名为tiff/tif
参数二是整型的flag,标志,默认值为IMREAD_COLOR,取值有如下几种:
IMREAD_UNCHANGED:如果设置,则按原样返回加载的图像(带有Alpha通道,否则会被裁剪)。
IMREAD_GRAYSCALE:如果设置,总是将图像转换为单通道灰度图像读入。
IMREAD_COLOR:如果设置,总是将图像转换为3通道BGR彩色图像读入。
IMREAD_ANYDEPTH:如果设置,当输入具有相应深度时返回16位/ 32位图像,否则将其转换为8位。
IMREAD_ANYCOLOR:如果设置,图像将以任何可能的颜色格式读取。
IMREAD_LOAD_GDAL:如果设置,总是使用GDAL驱动程序加载图像。
IMREAD_REDUCED_GRAYSCALE_2:如果设置,总是将图像转换为单通道灰度图像,图像尺寸减小1/2。
IMREAD_REDUCED_COLOR_2:如果设置,总是将图像转换为3通道BGR彩色图像,图像尺寸减小1/2。
IMREAD_REDUCED_GRAYSCALE_4:如果设置,总是将图像转换为单通道灰度图像,图像尺寸减小1/4。
IMREAD_REDUCED_COLOR_4:如果设置,总是将图像转换为3通道BGR彩色图像,图像尺寸减小1/4。
IMREAD_REDUCED_GRAYSCALE_8:如果设置,总是将图像转换为单通道灰度图像,图像尺寸减小1/8。
IMREAD_REDUCED_COLOR_8:如果设置,总是将图像转换为3通道BGR彩色图像,图像尺寸减小1/8
常用的是前三种。因为flags是整型,所以传入数值也行:
flags >0:等同于IMREAD_COLOR。
flags =0:等同于 IMREAD_GRAYSCALE。
flags <0: 等同于IMREAD_UNCHANGED。
通常是给1、0、-1,给其他整型也是可以的。
返回值:Mat类型。从opencv2开始,用于存放图像的数据类型就是Mat,
二、图像的显示
图像读取后,下一步就是再把图像显示出来,主要函数有:cv2.namedWindows()、cv2.imshow()。以上两个函数就可以让图像显示出来,在此另外再介绍三个函数cv2.waitKey()、cv2.destroyWindow()、cv2.destroyAllWindows()。
2.1 cv2.namedWindows函数介绍
void cv::namedWindow (const String & winname,int flags = WINDOW_AUTOSIZE )
功能:创建一个窗口。
参数:
参数一是winname,给创建的窗口起一个名字,以后通过这个名字调用该窗口。
参数二整型的flags,定义窗口的属性,默认值是WINDOW_AUTOSIZE,其他取值如下所示:
WINDOW_NORMAL:用户可以调整窗口大小(不受约束)/也可以使用将全屏窗口切换为正常大小。
WINDOW_AUTOSIZE:用户无法调整窗口大小,窗口大小随显示图像的大小而变化。
WINDOW_OPENGL:带有opengl支持的窗口。
WINDOW_FULLSCREEN:将窗口更改为全屏。
WINDOW_FREERATIO:不遵循图像的比例调整图像后在窗口显示
WINDOW_KEEPRATIO:根据图像的比例调整图像后在窗口中显示
常见的是前两个。
2.2 cv2.imshow函数介绍
void cv::imshow (const String & winname, InputArray mat )
功能:在指定窗口显示图像。
参数:
参数一是窗口名。
参数二设置为要显示的图像。
注意此函数之后应该跟随函数waitKey,指定窗口显示多少毫秒。
2.3 cv2.waitKey函数介绍
int cv::waitKey (int delay = 0)
功能:等待按键或延迟多少毫秒。
参数:整型的delay,默认值是0。设置为0表示永久等待按键,设置为非零,表示延迟delay毫秒。该函数仅在创建至少一个窗口并且窗口处于活动状态时才起作用。
2.4 cv2.destroyWindow/cv2.destroyAllWindows函数介绍
void cv::destroyWindow ( constString & winname )
功能是摧毁指定的窗口。参数winname设置为想要关闭的窗口。
void cv::destroyAllWindows()
功能是摧毁所有的窗口。
三、图像的保存
经常需要把需要的图像保存文件。用到的函数是cv2.imwrite()。
bool cv::imwrite( const String & filename, InputArray img, const std::vector< int > & params = std::vector< int >() )
功能:把图像保存为文件。
参数:
参数一是文件名,指定保存的文件名。
参数二是需要保存的图像。
参数三是设置保存的图片文件的属性,取值如下:
MWRITE_JPEG_QUALITY:对于JPEG,它可以是从0到100的质量(越高越好)。默认值是95。
IMWRITE_JPEG_PROGRESSIVE:启用JPEG功能,0或1,默认为False。
IMWRITE_JPEG_OPTIMIZE:启用JPEG功能,0或1,默认为False。
IMWRITE_JPEG_RST_INTERVAL:JPEG重新启动间隔,0 - 65535,默认为0 - 不重新启动。
IMWRITE_JPEG_LUMA_QUALITY:单独的亮度质量等级,0 - 100,默认为0 - 不使用。
IMWRITE_JPEG_CHROMA_QUALITY:独立的色度质量等级,0 - 100,默认为0 - 不使用。
IMWRITE_PNG_COMPRESSION:对于PNG,它可以是从0到9的压缩级别。较高的值意味着较小的尺寸和较长的压缩时间。默认值是3。
IMWRITE_PNG_STRATEGY:cv :: ImwritePNGFlags之一,默认为IMWRITE_PNG_STRATEGY_DEFAULT。
IMWRITE_PNG_BILEVEL:二进制级PNG,0或1,默认为0。
IMWRITE_PXM_BINARY:对于PPM,PGM或PBM,它可以是二进制格式标志,0或1.默认值为1。
IMWRITE_WEBP_QUALITY:对于WEBP,它可以是从1到100的质量(越高越好)。默认情况下(没有任何参数),质量超过100的情况下使用无损压缩。
初学入门可以不用在意该函数的第三个变量。
四、示例
代码如下:
import cv2
#图像的载入
img = cv2.imread('russia2018.jpg')
#创建窗口
cv2.namedWindow('image')
#图像显示
cv2.imshow('image',img)
#等待2000ms=2s
cv2.waitKey(2000)
#关闭所有窗口
cv2.destroyAllWindows()
#保存为png格式的图像
cv2.imwrite('russia2018.png',img)
实验结果就是,弹出一个窗口显示图像,2s后窗口消失。窗口如下:
五、进阶
感兴趣的人可以修改参数,如以灰度图像的方式读取图像,改变窗口属性,把图片保存为不同图像类型文件等。此外如果对于matplotlib库(Matplotlib是Python的绘图库,它提供了各种各样的绘图方法)比较熟悉的,可以尝试使用这个库显示图像。通过这种训练加深对函数的认识。