python opencv、matplotlib、PIL图像处理库之间的区别、联系、以及互相转换

  1. opencv
    a. 读取图像:
    img = cv.imread(path)
    opencv库使用imread读取得到的默认是一个BGR模式的彩色图像,可以使用cv.cvtColor(img, cv.COLOR_BGR2RGB)将颜色模式转化成RGB。opencv的基本图像类型与numpy数组可以互相转化。因此可以直接调用torch.from_numpy(img)将图像转成tensor。
    b. 保存图像:
    cv.imwrite(path, img)
    c. 绘制图像:
    cv.imshow(name, img)
    opencv的绘制图像操作会将图像以窗口的形式显示在屏幕上,因此需要手动执行中断命令来关闭窗口进程。一般会用到:
    k = cv.waitKey(0) & 0xFF
    if k == 27:
    cv.destroyAllWindows()
    优点:对图像处理的接口丰富,集成了许多常用的图像处理操作:阈值、边缘检测、角点检测、图像滤波、形态学处理、傅里叶变换、直方图均衡、模板匹配、运动检测(meanshift),并且支持人脸部位识别。
    缺陷:opencv在读取图像时,若path错误,仅会返回None,而不会报错,并且opencv不支持使用imread对gif格式的图像进行读取,若要读取gif格式的图像,需要使用gif = cv.VideoCapture(path)得到一个opencv的视频对象,然后使用ret,frame = gif.read()读取该视频对象的一帧。
  2. PIL
    PIL是python对图像处理的基本库
    a. 读取图像:
    img = PIL.Image.open(path)
    读取得到的是一个PIL.xxxImageFile类型,numpy中提供了与将PIL.ImageFile转化为array的接口:
    np.asarray(img) img->array
    Image.fromarray(array) array->img
    可以使用img.convert(model)转换颜色模式。其中model包括:‘1’:二值图,‘L’:灰度图,‘P’:8位彩色图像,‘RGB’:24位彩色图像(每个通道8位),‘RGBA’:相比RGB多了个alpha通道(不透明度)等等。
    b. 保存图像:
    img.save(path)
    c. 绘制图像:
    img.show()
    优点:支持的图片格式丰富,并且作为python的基本库,与各个库之间兼容性最好。
    缺点:图像处理算法较少。
  3. matplotlib
    matplotlib是python仿照matlab的绘图来开发的图像绘制库。
    a. 读取图像:
    img = plt.imread()
    matplotlib读取的图像类型直接为numpy.array,并且matplotlib读取图像时直接进行了归一化操作。
    b. 保存图像:
    plt.imsave(path,img)

    img.imsave(path)
    matplotlib在保存图像时,可以使用imsave保存不带坐标轴的图像,也可以使用plt.savefig(path)保存带坐标轴的图像。
    c. 绘制图像:
    plt.imshow(img)
    plt.show()
    matplotlib在执行imshow之后,必须跟着执行show()。
    优点:和matlab的绘图命令基本相同,不仅可以绘制图像,也可以绘制其他类型的图像(折线图、散点图、饼图、热力图、3D图),并且读入的图像与numpy直接兼容。
    缺点:matplotlib是一个绘图的库,因此没有图像处理相关的算法。
  4. 以上三个库读入的图像进行互相转化:
    python opencv、matplotlib、PIL图像处理库之间的区别、联系、以及互相转换
    三个库之间转换较为复杂,因此也有一种直接的转换策略,先保存图像,再使用另一个库读取图像。
  5. 关于pytorch处理数据集的一般应用策略:
    使用opecv读取并处理图像,使用matplotlib绘制图像,最终保存为PIL.Image,再使用pytorch的torchvision.transforms.ToTensor()(img)转化成tensor。