详解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 相关文章推荐
Pycharm设置界面全黑的方法
May 23 Python
python基于物品协同过滤算法实现代码
May 31 Python
python读取TXT每行,并存到LIST中的方法
Oct 26 Python
对pandas写入读取h5文件的方法详解
Dec 28 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
利用pandas合并多个excel的方法示例
Oct 10 Python
Python调用Windows命令打印文件
Feb 07 Python
Python如何使用paramiko模块连接linux
Mar 18 Python
Python基础教程(一)——Windows搭建开发Python开发环境
Jul 20 Python
Django Auth用户认证组件实现代码
Oct 13 Python
详解python的变量缓存机制
Jan 24 Python
使用Python的开发框架Brownie部署以太坊智能合约
May 28 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过滤危险html代码的函数
2008/07/22 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
基于php编程规范(详解)
2017/08/17 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
python基础教程之基本内置数据类型介绍
2014/02/20 Python
python执行子进程实现进程间通信的方法
2015/06/02 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
python将视频转换为全字符视频
2019/04/26 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
Python远程linux执行命令实现
2020/11/11 Python
一个入门级python爬虫教程详解
2021/01/27 Python
《在家里》教后反思
2014/03/01 职场文书
科研课题实施方案
2014/03/18 职场文书
简单租房协议书
2014/10/21 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
土建施工员岗位职责
2015/04/11 职场文书
MySQL创建管理子分区
2022/04/13 MySQL
NASA 机智号火星直升机拍到了毅力号设备碎片
2022/04/29 数码科技