详解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 06 Python
Python通过属性手段实现只允许调用一次的示例讲解
Apr 21 Python
python3判断url链接是否为404的方法
Aug 10 Python
Django中使用Celery的方法示例
Nov 29 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
Dec 05 Python
python flask解析json数据不完整的解决方法
May 26 Python
python爬虫解决验证码的思路及示例
Aug 01 Python
django-rest-swagger的优化使用方法
Aug 29 Python
Python3 A*寻路算法实现方式
Dec 24 Python
TensorFlow tensor的拼接实例
Jan 19 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 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数组最大值,最小值的代码
2011/10/31 PHP
php代码收集表单内容并写入文件的代码
2012/01/29 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
禁止js文件缓存的代码
2010/04/09 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
Scrapy框架使用的基本知识
2018/10/21 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
一份全面的PHP面试问题考卷
2012/07/15 面试题
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
社区活动邀请函范文
2014/01/29 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
亲情作文之母爱
2019/09/25 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python