详解python opencv、scikit-image和PIL图像处理库比较


Posted in Python onDecember 26, 2019

进行深度学习时,对图像进行预处理的过程是非常重要的,使用pytorch或者TensorFlow时需要对图像进行预处理以及展示来观看处理效果,因此对python中的图像处理框架进行图像的读取和基本变换的掌握是必要的,接下来python中几个基本的图像处理库进行纵向对比。

项目地址:https://github.com/Oldpan/Pytorch-Learn/tree/master/Image-Processing

比较的图像处理框架:

  • PIL
  • scikit-image
  • opencv-python

PIL:

由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。

摘自廖雪峰的官方网站

scikit-image

scikit-image is a collection of algorithms for image processing. It is available free of charge and free of restriction. We pride ourselves on high-quality, peer-reviewed code, written by an active community of volunteers.
摘自官网的介绍,scikit-image的更新还是比较频繁的,代码质量也很好。

opencv-python

opencv的大名就不要多说了,这个是opencv的python版

# Compare Image-Processing Modules
# Use Transforms Module of torchvision
#        &&&
# 对比python中不同的图像处理模块
# 并且使用torchvision中的transforms模块进行图像处理

# packages
from PIL import Image
from skimage import io, transform
import cv2

import torchvision.transforms as transforms
import matplotlib.pyplot as plt
%matplotlib inline

img_PIL = Image.open('./images/dancing.jpg')
img_skimage = io.imread('./images/dancing.jpg')
img_opencv = cv2.imread('./images/dancing.jpg')
img_plt = plt.imread('./images/dancing.jpg')

loader = transforms.Compose([
  transforms.ToTensor()]) # 转换为torch.tensor格式


print('The shape of \n img_skimage is {}\n img_opencv is {}\n img_plt is {}\n'.format(img_skimage.shape, img_opencv.shape, img_plt.shape))
print('The type of \n img_skimage is {}\n img_opencv is {}\n img_plt is {}\n'.format(type(img_skimage), type(img_opencv), type(img_plt)))
The shape of
img_skimage is (444, 444, 3)
img_opencv is (444, 444, 3)
img_plt is (444, 444, 3)
The size of
img_PIL is (444, 444)
The mode of
img_PIL is RGB
The type of
img_skimage is <class 'numpy.ndarray'>
img_opencv is <class 'numpy.ndarray'>
img_plt is <class 'numpy.ndarray'>
img_PIL if <class 'PIL.JpegImagePlugin.JpegImageFile'>
# 定义一个图像显示函数
def my_imshow(image, title=None):
  plt.imshow(image)
  if title is not None:
    plt.title(title)
  plt.pause(0.001) # 这里延时一下,否则图像无法加载

plt.figure()
my_imshow(img_skimage, title='img_skimage')
# 可以看到opencv读取的图像打印出来的颜色明显与其他不同
plt.figure()
my_imshow(img_opencv, title='img_opencv')
plt.figure()
my_imshow(img_plt, title='img_plt')

# opencv读出的图像颜色通道为BGR,需要对此进行转换
img_opencv = cv2.cvtColor(img_opencv, cv2.COLOR_BGR2RGB)
plt.figure()
my_imshow(img_opencv, title='img_opencv_new')

详解python opencv、scikit-image和PIL图像处理库比较

toTensor = transforms.Compose([transforms.ToTensor()])

# 尺寸变化、缩放
transform_scale = transforms.Compose([transforms.Scale(128)])
temp = transform_scale(img_PIL)
plt.figure()
my_imshow(temp, title='after_scale')

# 随机裁剪
transform_randomCrop = transforms.Compose([transforms.RandomCrop(32, padding=4)])
temp = transform_scale(img_PIL)
plt.figure()
my_imshow(temp, title='after_randomcrop')

# 随机进行水平翻转(0.5几率)
transform_ranHorFlip = transforms.Compose([transforms.RandomHorizontalFlip()])
temp = transform_scale(img_PIL)
plt.figure()
my_imshow(temp, title='after_ranhorflip')

# 随机裁剪到特定大小
transform_ranSizeCrop = transforms.Compose([transforms.RandomSizedCrop(128)])
temp = transform_ranSizeCrop(img_PIL)
plt.figure()
my_imshow(temp, title='after_ranSizeCrop')

# 中心裁剪
transform_centerCrop = transforms.Compose([transforms.CenterCrop(128)])
temp = transform_centerCrop(img_PIL)
plt.figure()
my_imshow(temp, title='after_centerCrop')

# 空白填充
transform_pad = transforms.Compose([transforms.Pad(4)])
temp = transform_pad(img_PIL)
plt.figure()
my_imshow(temp, title='after_padding')

# 标准化是在整个数据集中对所有图像进行取平均和均方差,演示图像数量过少无法进行此操作
# print(train_data.mean(axis=(0,1,2))/255)
# print(train_data.std(axis=(0,1,2))/255)
# transform_normal = transforms.Compose([transforms.Normalize()])

# Lamdba使用用户自定义函数来对图像进行剪裁
# transform_pad = transforms.Compose([transforms.Lambda()])

详解python opencv、scikit-image和PIL图像处理库比较

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
Tensorflow加载预训练模型和保存模型的实例
Jul 27 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
python读取文本中的坐标方法
Oct 14 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
Python如何实现爬取B站视频
May 20 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
Python3获取cookie常用三种方案
Oct 05 Python
Python代码覆盖率统计工具coverage.py用法详解
Nov 25 Python
torch 中各种图像格式转换的实现方法
Dec 26 #Python
python两个_多个字典合并相加的实例代码
Dec 26 #Python
Python时间差中seconds和total_seconds的区别详解
Dec 26 #Python
python requests模拟登陆github的实现方法
Dec 26 #Python
python 实现按对象传值
Dec 26 #Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
Dec 26 #Python
Pandas时间序列:重采样及频率转换方式
Dec 26 #Python
You might like
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
php实现RSA加密类实例
2015/03/26 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
[10:42]Team Liquid Vs Newbee
2018/06/07 DOTA
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
python制作一个桌面便签软件
2015/08/09 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
2020/08/02 Python
高中生的学习总结自我鉴定
2013/10/26 职场文书
违纪检讨书2000字
2014/02/08 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
学习十八大演讲稿
2014/09/15 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
2014年工程工作总结
2014/11/25 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
个人求职意向书
2015/05/11 职场文书
《七月的天山》教学反思
2016/02/19 职场文书