1. 库简介

深度学习领域,对视频图片样本的处理占了很大一部分比重。

而Python环境下的图像处理库种类较多,无论是精度,速度等方面都有不同的差异,这里予以总结。

 

Python环境下,相关的包有:

Numpy:主要作为图像数据的中转

Skimage:速度较慢,主要是caffe测试的时候默认的caffe.io.load使用,不建议使用(Skimage,读取RGB,通道HWC,范围[0,1])

 

 

主要的图像处理包:
CV2:opencv的python版本,应用较广
PIL:Python自带的图像处理库,但功能较简单
Pillow: 出发点在于PIL只支持python2.7,添加了一些新特性
Pillow-SIMD:Pillow增强版本,约有5倍的增益,比CV2还要快;安装方法:
$ pip uninstall
 pillow$ CC="cc
 -mavx2" pip install -U --force-reinstall pillow-simdMatplotlib:一般使用matplot.pyplot方法进行画图;

 

 

 

 

2. 平台需求

Caffe需要的图像格式是BGR,通道类型是CHW,范围[0,255];

 

后续的深度学习平台例如Pytorch需要的图像格式是RGB,通道类型CHW,范围[0,1];

(注:平台通道类型的要求CHW实际上是CUDA高效运算的需求,NCHW)

 

3. 常用库

  • Numpy

Numpy对多维矩阵A的操作一般有:

A.shape #HWC

type(A) #numpy.array

A.dtype() #uint8,
float…

np.min(A), np.max(A) #最值

 

  • CV2

读取BGR,通道HWC,范围[0,255] ,类型uint8; 图像类型numpy.ndarray;

 

  • PIL,Pillow, Pillow-SIMD

读取RGB,通道HWC,范围[0,255],类型uint8;图像类型PngImageFile (np.array, Image.fromarray直接与numpy互相转换)

有.mode方法---rgb信息

 

  • Matplotlib

读取RGB,通道HWC,范围[0,1] ,类型float;图像类型numpy.ndarray

 

  • Skimage

读取RGB,通道HWC,范围[0,255],类型uint8;图像类型numpy.ndarray

有.mode方法---rgb信息

比较特殊,读取的时候image= io.imread('test.jpg',as_grey=False);

彩图是uint8,[0,255];灰度图float,[0,1];

彩图resize变成float,[0,1];

较混乱,不适用。。。

 

4. 读取

    • CV2
    #默认读取为三通道彩图,可通过参数更改为单通道灰度图
    img = cv2.imread('examples.png')
    img_gray = cv2.imread('examples.png', 0)
     
    • PIL,Pillow, Pillow-SIMD
    img = Image.open('examples.png')
     
    • Matplotlib
    img = plt.imread('examples.png')

    5. 显示

    Matplotlib最主要目的是用来绘图:

    将numpy数组格式的RGB图像显示;

    float类型的图像,范围0-1;如果是uint8图像,范围是0-255;

     

      • Matplotlib
      img = plt.imread('examples.png')
      plt.imshow(img)
      plt.show()
       
      • CV2
      img = cv2.imread('examples.png')
      plt.imshow(img[..., -1::-1]) # 因为opencv读取进来的是bgr顺序,而imshow需要的是rgb顺序,因此需要先反过来,也可以plt.imshow(img[:,:,::-1])
      plt.show()
       
      • PIL
      #可直接打开
      plt.imshow(Image.open('examples.png')) # 实际上plt.imshow可以直接显示PIL格式图像
      plt.show()
      #转换为需要的numpy格式打开
      img_gray = img.convert('L') #转换成灰度图像
      img = np.array(img)
      img_gray = np.array(img_gray)
      plt.imshow(img) # or plt.imshow(img / 255.0)5
      plt.show()
      plt.imshow(img_gray, cmap=plt.gray()) # 显示灰度图要设置cmap参数
      plt.show()

      6. 转换

      主要是通过numpy的transpose操作,修正RGB,BGR;

      例如:

      a是rgb图像,那么

      a[::-1],a[:,::-1],a[:,:,::-1]分别是X轴的镜像,Y轴的镜像,BGR转换为RGB;

       

      opencv相关图像操作;
      img_gray = cv2.cvtColor(img,
       cv2.COLOR_BGR2GRAY) # BGR转灰度img_bgr = cv2.cvtColor(img_gray,
       cv2.COLOR_GRAY2BGR) # 灰度转BRGimg_rgb = cv2.cvtColor(img_gray,
       cv2.COLOR_GRAY2RGB) # 灰度转RGB 
      b,g,r = cv2.split(img) #bgr图像分离三个通道
      img2 = cv2.merge([r,g,b]) #merge成rgb图像
       
      PIL相关图像操作:
      img = Image.open('examples.png')
      img_gray = image.convert(‘L’)
      img_color = img_gray.convert(‘RGB’)
       
       
      PIL与numpy格式转换操作:
      numpy.asarray()
      Image.fromarray()
      如果是pil转opencv,记得需要通过copy命令得到的才可以进行cv2操作,不然会有bug。切忌
       
       
       
       
      PIL类型,尺寸信息,通过.size方法,得到WH;
      Numpy类型,通过shape方法,得到HWC
      注:如果是PIL自己的类型,得到尺寸信息要使用.size方法
      print image.size #width height
      同样进行resize操作,顺序也是wh;
      img2_resize = img2.resize((960,540))
      img2_resize.save('test1.jpg')
      而如果使用cv2操作,顺序也是wh;
      img3_resize = cv2.resize(img3, (960,540))
      cv2.imwrite('test2.jpg', img3_resize)
      但如果放在numpy里面,调用shape方法,得到的是HWC;

       

      7. 保存

        • PIL
        #直接save方法
        img = Image.open('examples.png')
        img.save('examples2.png')
        img_gray = img.convert('L')
        img_gray.save('examples_gray.png') # 不管是灰度还是彩色,直接用save函数保存就可以,但注意,只有PIL格式的图片能够用save函数
         
        • CV2
        #cv2.imwrite
        import cv2
        img = cv2.imread('examples.png') # 这是BGR图片
        cv2.imwrite('examples2.png', img) # 这里也应该用BGR图片保存,这里要非常注意,因为用pylab或PIL读入的图片都是RGB的,如果要用opencv存图片就必须做一个转换
        img_gray = cv2.cvtColor(img,
         cv2.COLOR_BGR2GRAY)cv2.imwrite('examples_gray.png', img_gray)