详解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 相关文章推荐
Windows系统下安装Python的SSH模块教程
Feb 05 Python
Python返回数组/List长度的实例
Jun 23 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
Apr 29 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
Win 10下Anaconda虚拟环境的教程
May 18 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
Jun 11 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
终于听上了直流胆调频
2021/03/02 无线电
php多文件上传功能实现原理及代码
2013/04/18 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
XENON基于JSON变种
2010/07/27 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
js控件Kindeditor实现图片自动上传功能
2020/07/20 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
python万年历实现代码 含运行结果
2017/05/20 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
Saks Fifth Avenue澳洲/亚太地区:萨克斯第五大道精品百货店
2019/06/09 全球购物
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
办公室年终个人自我评价
2013/10/28 职场文书
酒店总经理工作职责
2013/12/13 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android