Python 中有很多包能够处理图像,如 matplotlib, PIL, imageio, OpenCV 等。其中,OpenCV 提供了强大的图像处理模块,但是,OpenCV 读取图像的方式与其他包差别较大,比如读取的彩色图像通道顺序是 BGR。同时,OpenCV 读取图像的能力也很强大,不仅能够读取灰度、彩色,还能读取任何可能颜色格式的图像。这也为使用 OpenCV 读取图像变得难以掌握。本篇介绍如何使用 OpenCV 读取图像。

安装 OpenCV

假设已经安装了 Miniconda, 那么安装 OpenCV 只需要一条命令:

1
2
3
pip install opencv-python
# 或者
pip install opencv-contrib-python

上面两个命令都能安装 OpenCV,其中 opencv-python 为基本包,包含了 OpenCV 中的主要模块,常规使用足够。opencv-contrib-python 中除了包含主要模块外,还包括一些扩展模块,这些扩展模块包含了一些带专利的算法(比如 shift 特征检测模块)以及一些新添加的测试模块(稳定后合并到主要模块)。

读取图像

安装好后,使用 OpenCV 读取图像只需要一条命令:

1
2
3
import cv2 as cv

img = cv.imread(img_path, flag)

安装 OpenCV 后,导入的模块是 cv2,img_path 为图像文件路径,flag 为读取文件标识。flag 有如下取值,需要根据不同的图像类型进行选择:

1
2
3
4
5
6
7
8
9
10
11
12
13
IMREAD_UNCHANGED            = -1, //返回包含alpha通道的加载图像
IMREAD_GRAYSCALE = 0, //返回一个灰度图像
IMREAD_COLOR = 1, //返回一个BGR通道的图像
IMREAD_ANYDEPTH = 2, //当输入具有相应的深度时返回16位/ 32位图像,否则将其转换为8位。.
IMREAD_ANYCOLOR = 4, //则以任何可能的颜色格式读取图像。
IMREAD_LOAD_GDAL = 8, //使用GDAL的驱动加载图像。
IMREAD_REDUCED_GRAYSCALE_2 = 16, //将图像转换为单通道灰度图像,图像大小减少1/2
IMREAD_REDUCED_COLOR_2 = 17, //转换图像的3通道BGR彩色图像和图像的大小减少1/2
IMREAD_REDUCED_GRAYSCALE_4 = 32, //将图像转换为单通道灰度图像,图像大小减少1/4
IMREAD_REDUCED_COLOR_4 = 33, //转换图像的3通道BGR彩色图像和图像的大小减少1/4
IMREAD_REDUCED_GRAYSCALE_8 = 64, //将图像转换为单通道灰度图像,图像大小减少1/8
IMREAD_REDUCED_COLOR_8 = 65, //转换图像的3通道BGR色彩图像和图像大小减少1/8
IMREAD_IGNORE_ORIENTATION = 128 //不旋转图像根据EXIF的定位标志。

读取图像时,flag 可以传入整数值或标识,如下命令读取彩色图像(注意,如果不传 flag,默认为 1):

1
2
3
img = cv.imread(img_path, 1)
# 等价于
img = cv.imread(img_path, IMREAD_COLOR)

OpenCV 读取的图像是 numpy.ndarray 对象,且彩色图像的通道顺序为 BGR,通过查看 ndarray 形状,可获知图像的高、宽信息:

1
2
3
img.shape
(417, 563, 3)
# (height, width, channels)

支持的图像类型

OpenCV 支持多种图像类型,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
-   Windows bitmaps - \*.bmp, \*.dib (always supported)
- JPEG files - \*.jpeg, \*.jpg, \*.jpe (see the *Note* section)
- JPEG 2000 files - \*.jp2 (see the *Note* section)
- Portable Network Graphics - \*.png (see the *Note* section)
- WebP - \*.webp (see the *Note* section)
- Portable image format - \*.pbm, \*.pgm, \*.ppm \*.pxm, \*.pnm (always supported)
- PFM files - \*.pfm (see the *Note* section)
- Sun rasters - \*.sr, \*.ras (always supported)
- TIFF files - \*.tiff, \*.tif (see the *Note* section)
- OpenEXR Image files - \*.exr (see the *Note* section)
- Radiance HDR - \*.hdr, \*.pic (always supported)
- Raster and Vector geospatial data supported by GDAL (see the *Note* section)

参考文献

  1. OpenCV之imread,imwrite,imshow