详解Python Opencv和PIL读取图像文件的差别


Posted in Python onDecember 27, 2019

前言

之前在进行深度学习训练的时候,偶然发现使用PIL读取图片训练的效果要比使用python-opencv读取出来训练的效果稍好一些,也就是训练更容易收敛。可能的原因是两者读取出来的数据转化为pytorch中Tensor变量稍有不同,这里进行测试。

之后的代码都导入了:

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import torch
import cv2

测试

使用PIL和cv2读取图片时会有细微的区别,通过下面的代码可以发现两者读取图片是有区别的,也就是使用PIL读取出来的图片转为numpy格式和直接使用cv读取的图片在像素点上并不是完全一致:

In[11]: image = cv2.imread('datasets/0_target.jpg')
In[18]: image_pil = Image.open('datasets/0_target.jpg').convert('RGB')
In[19]: image_pil = np.array(image_pil)
In[20]: image_cv = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
In[21]: image_cv == image_pil
Out[21]: 
array([[[ True, True, False],
    [ True, False, False],
    [False, False, False],
    ...,
    [ True, True, True],
    [ True, True, True],
    [ True, True, True]],

    [[ True, True, False],
    [ True, True, True],
    [False, True, False],
    ...,
    [ True, True, False],
    [ True, True, True],
    [ True, True, True]],

    [[ True, True, False],
    [ True, True, True],
    [False, False, False],
    ...,
    [ True, True, True],
    [ True, True, True],
    [ True, True, False]],

    ...,

    [[ True, True, True],
    [ True, True, True],
    [ True, True, True],
    ...,
    [False, False, True],
    [ True, True, True],
    [False, False, False]],

    [[ True, True, True],
    [ True, True, True],
    [ True, True, True],
    ...,
    [ True, True, True],
    [ True, True, True],
    [False, False, False]],

    [[ True, False, False],
    [ True, False, False],
    [ True, False, False],
    ...,
    [ True, True, True],
    [False, False, False],
    [ True, False, False]]])
In[26]: image_cv.shape
Out[26]: (682, 700, 3)
In[27]: image_pil.shape
Out[27]: (682, 700, 3)
In[28]: image_pil - image_cv
Out[28]: 
array([[[ 0,  0,  1],
    [ 0, 255,  3],
    [255,  1,  2],
    ...,
    [ 0,  0,  0],
    [ 0,  0,  0],
    [ 0,  0,  0]],

    [[ 0,  0,  2],
    [ 0,  0,  0],
    [255,  0,  2],
    ...,
    [ 0,  0, 254],
    [ 0,  0,  0],
    [ 0,  0,  0]],

    [[ 0,  0,  2],
    [ 0,  0,  0],
    [255,  1,  2],
    ...,
    [ 0,  0,  0],
    [ 0,  0,  0],
    [ 0,  0, 254]],

    ...,

    [[ 0,  0,  0],
    [ 0,  0,  0],
    [ 0,  0,  0],
    ...,
    [254,  1,  0],
    [ 0,  0,  0],
    [ 1, 255,  3]],

    [[ 0,  0,  0],
    [ 0,  0,  0],
    [ 0,  0,  0],
    ...,
    [ 0,  0,  0],
    [ 0,  0,  0],
    [ 2, 254,  4]],

    [[ 0,  1, 253],
    [ 0,  1, 253],
    [ 0,  1, 255],
    ...,
    [ 0,  0,  0],
    [ 1, 254,  1],
    [ 0, 255,  2]]], dtype=uint8)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python下的Mysql模块MySQLdb安装详解
Apr 09 Python
详解Python的Django框架中inclusion_tag的使用
Jul 21 Python
python并发和异步编程实例
Nov 15 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
对Python定时任务的启动和停止方法详解
Feb 19 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
深入学习python多线程与GIL
Aug 26 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
Oct 11 Python
numpy.array 操作使用简单总结
Nov 08 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
python解包概念及实例
Feb 17 Python
pandas 对group进行聚合的例子
Dec 27 #Python
pandas-resample按时间聚合实例
Dec 27 #Python
python 实现简单的FTP程序
Dec 27 #Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 #Python
python实现异常信息堆栈输出到日志文件
Dec 26 #Python
Python的对象传递与Copy函数使用详解
Dec 26 #Python
Python pandas库中的isnull()详解
Dec 26 #Python
You might like
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
event.srcElement 用法笔记e.target
2009/12/18 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
最近Python有点火? 给你7个学习它的理由!
2017/06/26 Python
使用 Python 处理 JSON 格式的数据
2019/07/22 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Python之Class&Object用法详解
2019/12/25 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
python如何查看网页代码
2020/06/07 Python
python属于跨平台语言码
2020/06/09 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
规划编制实施方案
2014/03/15 职场文书
教学改革实施方案
2014/03/31 职场文书
期末复习计划
2015/01/19 职场文书
办公室岗位职责
2015/02/04 职场文书
中国合伙人观后感
2015/06/02 职场文书
详解MySQL集群搭建
2021/05/26 MySQL
Python数据可视化之Seaborn的安装及使用
2022/04/19 Python