详解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 20 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
Jul 08 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
深入浅析Python的类
Jun 22 Python
python八皇后问题的解决方法
Sep 27 Python
解决.ui文件生成的.py文件运行不出现界面的方法
Jun 19 Python
Django基础三之视图函数的使用方法
Jul 18 Python
python自动发微信监控报警
Sep 06 Python
Python 继承,重写,super()调用父类方法操作示例
Sep 29 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
浅析Python迭代器的高级用法
Jul 16 Python
详细介绍python操作RabbitMq
Apr 12 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上传图片重命名的6种解决方法的详细介绍
2013/04/28 PHP
php二分查找二种实现示例
2014/03/12 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
Javascript UrlDecode函数代码
2010/01/09 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
Python的语言类型(详解)
2017/06/24 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
python自动发送邮件脚本
2018/06/20 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
高中生的学习总结自我鉴定
2013/10/26 职场文书
小学教师寄语大全
2014/04/03 职场文书
文明好少年事迹材料
2014/08/19 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
《鲸》教学反思
2016/02/23 职场文书
八年级作文之感恩
2019/11/22 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
SpringBoot 集成Redis 过程
2021/06/02 Redis
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL