详解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 相关文章推荐
Python3基础之基本运算符概述
Aug 13 Python
kNN算法python实现和简单数字识别的方法
Nov 18 Python
python中函数总结之装饰器闭包详解
Jun 12 Python
Python学习小技巧之利用字典的默认行为
May 20 Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 Python
遗传算法python版
Mar 19 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 Python
Python 找出英文单词列表(list)中最长单词链
Dec 14 Python
使用numpngw和matplotlib生成png动画的示例代码
Jan 24 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
地摊中国 - 珍藏老照片
2020/08/18 杂记
php后门URL的防范
2013/11/12 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
2008/03/22 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
2015/08/28 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
Python解析json时提示“string indices must be integers”问题解决方法
2019/07/31 Python
Python简易版停车管理系统
2019/08/12 Python
python实现静态服务器
2019/09/05 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
新电JAVA笔试题目
2014/08/31 面试题
后勤主管工作职责
2013/12/07 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
简短清晨问候语
2015/11/10 职场文书
Android studio 简单计算器的编写
2022/05/20 Java/Android
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js