详解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基于pygame实现的弹力球效果(附源码)
Nov 11 Python
Python中random模块生成随机数详解
Mar 10 Python
老生常谈进程线程协程那些事儿
Jul 24 Python
python中通过预先编译正则表达式提高效率
Sep 25 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
python 爬虫 批量获取代理ip的实例代码
May 22 Python
Python数据类型之Set集合实例详解
May 07 Python
使用python爬取微博数据打造一颗“心”
Jun 28 Python
python处理大日志文件
Jul 23 Python
python SocketServer源码深入解读
Sep 17 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
Python list和str互转的实现示例
Nov 16 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 include_path设置技巧分享
2011/07/03 PHP
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
php截取字符串函数分享
2015/02/02 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
Javascript继承机制详解
2017/05/30 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
运动会稿件100字
2014/09/24 职场文书
婚礼答谢礼品
2015/01/20 职场文书
检讨书怎么写
2015/01/23 职场文书
售后服务质量承诺书
2015/04/29 职场文书
学校捐书活动总结
2015/05/08 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python