Python-OpenCV图像处理
0 Python图像处理库
- 常用的有OpenCV, Pillow(PIL)和scikit-image. 比较常用的是前两个,做个简单的比较。
- OpenCV
- 原版OpenCV是基于C++的,现在使用的是python版本。
- 处理速度快
- 读取图片直接就是numpy ndarray类型
- 读取图片是(B,G,R)通道,比较特殊
-image.shape
得到的是(H,W,C) - Pillow
- Pytorch中比较常用
- 读取图片是PIL Image格式,需要进一步转换为numpy ndarray类型
-image.size
得到的是(W,H) - 有比较说明OpenCV处理速度优势比较大,Python Pillow 和 cv2 图片 resize 速度的比较
1 图像的读取与保存
读取图像
imread(filename[, flags])
. 关于flag
的含义:
Flag | 变量 | 含义 |
---|---|---|
-1 | cv.IMREAD_UNCHANGED | 读取原图像,保留所有通道和原位深。例如,png图像有alpha通道则会保留,而其他模式会丢弃alpha通道。 |
0 | cv.IMREAD_GRAYSCALE | 将读取的图片转换为1-channel,8-bit的灰度图像。所以可能改变原图像的通道数和位深。 |
1 | cv.IMREAD_COLOR | (默认)将读取的图片转换为3-channel,8-bit的BGR彩色图像。所以可能改变原图像的通道数和位深。 |
2 | cv.IMREAD_ANYDEPTH | 根据图像的位深,可以读取为1-channel,8、16或32-bit的图像。所以可能改变原图像的通道数。 |
3 | cv.IMREAD_ANYCOLOR | If set, the image is read in any possible color format. |
>3 | - | 不常用 |
注意:
- 大多数彩色图像都是3-channel,8-bit的,所以直接调用默认模式(flag=1)就可以。
- 对于特殊的图像,如深度图、高度图,保存格式为32-bit float的要指定
flag=2
,否则会出错(opencv并不提醒,只是返回None对象)。 - 对于未知的图像(通道、位深都未知),采用
flag=-1
模式进行读取比较保险。
保存图像
imwrite(filename, img)
. 保存格式通过文件的后缀名指定。一般情况下,只有8-bit,1-channel或8-bit,3-channel的图像可以通过此函数保存。不过有以下例外:
- 16-bit unsigned 图像,可以保存为PNG, JPEG200或TIFF格式。
- 32-bit float 图像,可以保存为PFM, TIFF, OpenEXR, and Radiance HDR格式。32-bit,3-channel的TIFF图像保存时采用LogLuv高动态范围编码。
- 包含alpha通道的PNG图像可以通过此函数保存。保证图像为 8-bit(or 16-bit),4-channel 的BGRA格式,全透明像素alpha值为0,完全不透明的像素alpha值为255/65535.
BGR转RGB
有下面三种方法,推荐第2,3种,比较快。
- 方法1
b, g, r = cv2.split(im)
im_rgb1 = cv2.merge([r, g, b])
- 方法2
im_rgb2 = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
- 方法3
im_rgb3 = im[: , : , ::-1]
颜色映射
当我们想要可视化特殊二维图像(如从浮点格式的高度、深度图转换而来)时,可以使用颜色映射指定显示的效果
cv2.applyColorMap(img, colormap)
这里的colormap
可用的选项如下:
问题
docker环境中使用import opencv
报错:
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
解决方法:
pip install opencv-python-headless