详解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多线程编程方式分析示例详解
Dec 06 Python
windows下python模拟鼠标点击和键盘输示例
Feb 28 Python
wxPython中文教程入门实例
Jun 09 Python
python之import机制详解
Jul 03 Python
Python去除列表中重复元素的方法
Mar 20 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
Python中collections模块的基本使用教程
Dec 07 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
python 安装impala包步骤
Mar 28 Python
Matplotlib绘制条形图的方法你知道吗
Mar 21 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
PHP4引用文件语句的对比
2006/10/09 PHP
基于mysql的bbs设计(五)
2006/10/09 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
基于JavaScript实现选项卡效果
2017/07/21 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
小程序云开发实战小结
2018/10/25 Javascript
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
Python 实现一个简单的web服务器
2021/01/03 Python
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
求职简历中自我评价
2014/01/28 职场文书
电大毕业个人生自我鉴定
2014/03/26 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
大学生职业生涯规划大赛作品(精品)
2014/09/17 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
失职检讨书大全
2015/01/26 职场文书
医生辞职信范文
2015/03/02 职场文书
个人年终总结怎么写
2015/03/09 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
postgresql无序uuid性能测试及对数据库的影响
2021/06/11 PostgreSQL