详解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基础语法(Python基础知识点)
Feb 28 Python
Python信息抽取之乱码解决办法
Jun 29 Python
pycharm远程调试openstack的图文教程
Nov 21 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
在Python中append以及extend返回None的例子
Jul 20 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
Python数据可视化:泊松分布详解
Dec 07 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
Jun 10 Python
详解Python 循环嵌套
Jul 09 Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 Python
Django框架模板用法详解
Jun 10 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 文件编程综合案例-文件上传的实现
2013/07/03 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
javascript显示选择目录对话框的代码
2008/11/10 Javascript
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
JQueryEasyUI datagrid框架的进阶使用
2013/04/08 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
JavaScript函数节流和函数防抖之间的区别
2017/02/15 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
jquery 键盘事件的使用方法详解
2017/09/13 jQuery
基于jquery的on和click的区别详解
2018/01/15 jQuery
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
2020/04/03 Javascript
python 动态加载的实现方法
2017/12/22 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
安全生产责任书范本
2014/04/15 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
卖车协议书范本4篇
2014/10/01 职场文书