在图像处理过程中,读取图像、显示图像、保存图像是最基本的操作。
1、读取图像
OpenCV 提供了函数cv2.imread()来读取图像,该函数支持各种静态图像格式。该函数的语法格式为:
Retval = cv2.imread(path_of_image, intflag)
式中:
- Retval 是返回值,其值是读取到的图像。如果未读取到图像,则返回“None”。
- path_of_image表示要读取的图像的完整文件名。
- intflag是读取标记。该标记用来控制读取文件的类型,具体如表1 所示。表1 中的第一列参数与第三列数值是等价的。例如cv2.IMREAD_UNCHANGED=−1,在设置参数时,既可以使用第一列的参数值,也可以采用第三列的数值。
表1 flags标记值
值 |
含义 |
数值 |
cv2.IMREAD_UNCHANGED |
保持原格式不变 |
-1 |
cv2.IMREAD_GRAYSCALE |
将图像调整为单通道的灰度图像 |
0 |
cv2.IMREAD_COLOR |
将图像调整为 3 通道的BGR 图像。该值是默认值 |
1 |
cv2.IMREAD_ANYDEPTH |
当载入的图像深度为 16 位或者32 位时,就返回其对应的深度图像;否则,将其转换为8 位图像 |
2 |
cv2.IMREAD_ANYCOLOR |
以任何可能的颜色格式读取图像 |
4 |
cv2.IMREAD_LOAD_GDAL |
使用 gdal 驱动程序加载图像 |
8 |
cv2.IMREAD_REDUCED_GRAYSCALE_2 |
将图像转换为单通道灰度图像,并将图像尺寸减小 1/2 |
|
cv2.IMREAD_REDUCED_COLOR_2 |
将图像转换为 3 通道BGR 彩色图像,并将图像尺寸减小1/2 |
|
cv2.IMREAD_REDUCED_GRAYSCALE_4 |
始终将图像转换为单通道灰度图像,并将图像尺寸减小为原来的1/4 |
|
cv2.IMREAD_REDUCED_COLOR_4 |
将图像转换为 3 通道BGR 彩色图像,并将图像尺寸减小为原来的1/4 |
|
cv2.IMREAD_REDUCED_GRAYSCALE_8 |
将图像转换为单通道灰度图像,并将图像尺寸减小为原来的1/8 |
|
cv2.IMREAD_REDUCED_COLOR_8 |
将图像转换为 3 通道BGR 彩色图像,并将图像尺寸减小为原来的1/8 |
|
cv2.IMREAD_IGNORE_ORIENTATION |
不以 EXIF 的方向为标记旋转图像 |
函数 cv2.imread()能够读取多种不同类型的图像,具体如表2 所示。
表2 cv2.imread()函数支持的图像格式
图像 |
扩展名 |
Windows 位图 |
*.bmp、*.dib |
JPEG 文件 |
*.jpeg、*.jpg、*.jpe |
JPEG 2000 文件 |
*.jp2 |
便携式网络图形(Portable Network Graphics,PNG)文件 |
*.png |
WebP 文件 |
*.webp |
便携式图像格式(Portable Image Format) |
*.pbm、*.pgm、*.ppm、*.pxm、*.pnm |
Sun(Sun rasters)格式 |
*.sr、*.ras |
TIFF 文件 |
*.tiff、*.tif |
OpenEXR 图像文件 |
*.exr |
Radiance 格式高动态范围(High-Dynamic Range,HDR)成像图像 |
*.hdr、*.pic |
GDAL 支持的栅格和矢量地理空间数据 |
Raster、Vector 两大类 |
例如,想要读取当前目录下文件名为example_img.bmp 的图像,并保持按照原有格式读入,则使用的语句为:
Img = cv2.imread("example_img.bmp", -1)
即使图像路径错误,它也不会引发任何错误,但是print img 会给出None。需要注意,上述程序要想正确运行,首先需要导入cv2模块,大多数常用的OpenCV函数都在cv2模块内。
2、显示图像
OpenCV 提供了函数 cv2.imshow()用来显示图像,其语法格式为:
None = cv2.imshow( winname, mat )
式中:
- winname 是窗口名称,它是一个字符串。
- mat 是要显示的图像。
你可以根据需要创建任意多个窗口,但可以使用不同的窗口名称。
例如,在一个窗口内显示读取的图像,代码如下:
import cv2 as cv
img = cv.imread('example_img.bmp', 0) # 加载彩色灰度图像
cv.imshow("lesson", img)
cv.waitKey()
在本程序中,首先通过cv2.imread()函数读取图像example_img.bmp,接下来通过cv2.imshow()函数在窗口lesson内显示图像example_img.bmp。
需要注意,上述程序要想正确运行,首先需要导入函数 cv2.waitKey(),该函数用来等待按键,当用户按下键盘后,该语句会被执行,并获取返回值。其语法格式为:
retval = cv2.waitKey( [delay] )
式中:
- retval 表示返回值。如果没有按键被按下,则返回−1;如果有按键被按下,则返回该按键的ASCII 码。
- delay 表示等待键盘触发的时间,单位是ms。当该值是负数或者零时,表示无限等待。该值默认为0。
在实际使用中,可以通过函数cv2.waitKey()获取按下的按键,并针对不同的键做出不同的反应,从而实现交互功能。
从另外一个角度理解,该函数还能够让程序实现暂停功能。当程序运行到该语句时,会按照参数delay 的设定等待特定时长。根据该值的不同,可能有不同的情况:
- 如果参数 delay 的值为0,则程序会一直等待。直到有按下键盘按键的事件发生时,才会执行后续程序。
- 如果参数delay 的值为一个正数,则在这段时间内,程序等待按下键盘按键。当有按下键盘按键的事件发生时,就继续执行后续程序语句;如果在delay 参数所指定的时间内一直没有这样的事件发生,则超过等待时间后,继续执行后续的程序语句。
在本例中,由于cv2.waitKey()函数的参数值是默认值0,所以在未按下键盘上的按键时,程序会一直处于暂停状态。当按下键盘上的任意一个按键时,程序中cv2.waitKey()下方的语句便得以执行,直到程序执行完终止。
3、保存图像
OpenCV 提供了函数cv2.imwrite(),用来保存图像,该函数的语法格式为:
retval = cv2.imwrite( filename, img[, params] )
式中:
- retval 是返回值。如果保存成功,则返回逻辑值真(True);如果保存不成功,则返回逻辑值假(False)。
- filename 是要保存的目标文件的完整路径名,包含文件扩展名。
- img 是被保存图像的名称。
- params 是保存类型参数,是可选的。
例如,将读取的图像保存到img目录下,代码如下:
import cv2 as cv
img = cv.imread('example_img.bmp', 0) # 加载彩色灰度图像
ret = cv.imwrite('img/result.bmp', img)
上述程序会先读取图像example_img.bmp,生成它的一个副本图像,然后将该图像以名称result.bmp 存储到img目录下。