首页 > 技术文章 > Python-OpenCV图像处理

tofengz 2020-08-30 23:22 原文

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可用的选项如下:
opencv colormap

问题

docker环境中使用import opencv报错:

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

解决方法:

pip install opencv-python-headless

推荐阅读