文章目录

  • 1 图片说明
  • 2 两种读取方式+显示
  • 3 numpy中transpose的使用
  • 4 数据类型转换+归一化
  • 5 PIL.Image读取png和jpg有什么区别

1 图片说明

两张图片格式不同,1为jpg,2为png。
2.jpg是我强制重命名得到的,其原版为2.png

2 两种读取方式+显示

  • Opencv读取
    图片类型为numpy的数组,BGR三通道(png或jpg格式都是三通道。后期需要转成RGB),数据类型为uint8(后期用np.array转一下成float32),范围是0-255,HWC排列。
  • PIL读取:以PIL.Image.open(img_path).convert('RGB)为例(原因详见第5节)
    图片类型为PIL图片,图片尺寸为WH(后面numpy一转就变了),在用np.array转一下之后,图片类型编程numpy数组,RGB三通道(故不需要转),数据类型为uint8(在前面np.array转成float32的话,此地就是float32),范围是0-255,变成HWC排列。
from PIL import Image
import cv2
import matplotlib.pyplot as plt    # 显示PIL.Image读取的图片image1 = cv2.imread('images\\2.png')
print('type(image1):', type(image1))    # type(image1): <class 'numpy.ndarray'>
print(image1.shape)    # (109, 992, 3)
print(image1.dtype)    # uint8cv2.imshow('image1', image1)
cv2.waitKey(0)img00 = Image.open('images\\1.jpg').convert('RGB')
print(img00)            # <PIL.Image.Image image mode=RGB size=254x469 at 0x1EEE84533C8>
print(img00.size)      # (254, 469)      少了通道数,只有尺寸,顺序是W,H
print(type(img00))        # <class 'PIL.Image.Image'>
print(np.array(img00, dtype=np.float32).shape)    # (469, 254, 3)      # 只要用numpy一操作,立刻变成HWCplt.figure("img0")
plt.imshow(img0)
plt.show()

3 numpy中transpose的使用

  • 针对opencv示例

有两种方式,详见代码

import cv2
import numpy as npimage1 = cv2.imread('images\\2.png')        # BGR    HWC: (109, 992, 3)# 从BGR到RGB:imgRGB = imgBGR[:,:,::-1]
image2 = image1[:,:,::-1].transpose(2, 0, 1)          # HWC2CHW: (3, 109, 992)
image3 = np.transpose(image1[:,:,::-1], (2, 0, 1))print(image2.shape)      # (3, 109, 992)
print(image2.dtype)      # uint8
print(image3.shape)      # (3, 109, 992)
print(image3.dtype)      # uint8
  • 针对PIL.Image示例
from PIL import Image
import numpy as npimg00 = Image.open('images\\1.jpg').convert('RGB')img11 = np.transpose(np.array(img00, dtype=np.float32))     # CWH
img22 = np.transpose(np.array(img00, dtype=np.float32), (2, 0, 1))      # CWH2CHW
print(img11.shape)      # (3, 254, 469)
print(img22.shape)      # (3, 469, 254)

4 数据类型转换+归一化

从uint转到float

import cv2
import numpy as npimage1 = cv2.imread('images\\2.png')        # BGR HWC: (109, 992, 3)
image2 = image1 / 255.0              # 0 - 255 to 0.0 - 1.0
print(image2.dtype)        # float64      如果想让它变成float32类型呢?
# 方式1
image3 = np.array(image1/255, dtype=np.float32)    # dtype可控制转换后数据类型
print(image3.dtype)        # float32
# 方式2,本质上和1相同
# ascontiguousarray函数将一个内存不连续存储的数组转换为内存连续存储的数组,使得运行速度更快。
image2 = np.ascontiguousarray(image1, dtype=np.float32)  # uint8 to fp32
image2 /= 255.0            # 0 - 255 to 0.0 - 1.0
print(image2.dtype)        # float32

5 PIL.Image读取png和jpg有什么区别

Image.open(x).convert('RGB')

使用Image.open读出图像即可,为什么还需要使用convert(‘RGB’)转换成RGB,难道Image.open()读出的彩色图像不是RGB吗?

看代码中的image mode

img0 = Image.open('images\\1.jpg')
print(img0)
# <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=254x469 at 0x201FDFDBBA8>img00 = Image.open('images\\1.jpg').convert('RGB')
print(img00)
# <PIL.Image.Image image mode=RGB size=254x469 at 0x201FD60EBA8># 2.jpg是我强制重命名得到的,其原版图为2.png
img1 = Image.open('images\\2.jpg')
print(img1)
# <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=992x109 at 0x201FE0745F8>img2 = Image.open('images\\2.png')
print(img2)
# <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=992x109 at 0x201FE074AC8>img3 = Image.open('images\\2.png').convert('RGB')
print(img3)
# <PIL.Image.Image image mode=RGB size=992x109 at 0x201FD60EC18>

可以看到,对于png图像,如果不使用.convert(‘RGB’)进行转换的话,读出来的图像是RGBA四通道的,A通道为透明通道,对深度学习模型训练来说暂时用不到。虽然jpg没有这个问题,为了统一,因此使用convert(‘RGB’)进行通道转换。

【jpg和png区别】PIL和opencv读取、显示图片+归一化+transpose变换通道相关推荐

  1. qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...

    前言勇哥对于C语言,C++早些年有一些接触,这个系列贴子就记载一下C++应用框架的学习经验. 在写程序时,UI.基础类库.应用程序框架对于vc来讲,只能依靠MFC和QT了. 勇哥对MFC有很强的抵触, ...

  2. opencv java 显示图片_【opencv三】利用opencv读取显示图片

    在opencv中读取显示图片的头文件是highgui.hpp. 整体代码如下,如要测试自己的图片,需要将代码段中的图片地址更改为自己图片的绝对路径. #include "opencv2/hi ...

  3. OpenCV读取显示图片报错size.width>0

    OpenCV读取图片时 error: (-215:Assertion failed) size.width>0 && size.height>0 in function ' ...

  4. python opencv 读取显示图片

    读取图片路径有中文似乎会产生问题 import cv2 import numpy as np img = cv2.imread('touxiang.jpg',cv2.IMREAD_GRAYSCALE) ...

  5. Opencv不显示图片

    问题: Opencv不显示图片.具体情况如图: 经过查找,发现是安装opencv之前,没有安装依赖项libgtk2.0-dev,参考,我在装这个包时又出现了同样问题,因此我换了个思路.依赖项libgt ...

  6. 踩坑记录 PIL与Opencv读取图像的差别

    1.读入的数据类型不同 PIL读入图像,以jepg为例,类型为PIL.JpegImagePlugin.JpegImageFile: Opencv读入图像,直接就是numpy.ndarray. 2.宽. ...

  7. opencv读取透明图片

    1.遇到的问题: 现在有一张背景是透明的图片,也就是背景是蒙版的图片,我要使用opencv读取这张图片,进行操作. 用默认方式读取图片之后,图片中的透明背景居然自动变成了黑色背景. 2.解决方法: 这 ...

  8. Opencv 读取灰度图像会识别为3通道问题

    最近初接触图像cv,一切都是从零开始因此遇到了许多问题,故在此记录遇到的问题方便提醒自己也方便后来人不再困惑. 场景: 我们都知道灰度图或者红外图都是单通道图片,而彩色图片是三通道图片.但是当我们用i ...

  9. 【OpenCV】读取显示图片及Mat类

    前言   继Matlab后,OpenCV成了最近这段时间的主攻学习目标.本科有学过一阵OpenCV,也做过项目,但整体学习不够系统,部分知识也遗忘,再加上OpenCV加入了许多新的内容,故重拾Open ...

最新文章

  1. 写出下列数学式对应的python表达式_Python程序设计课后习题答案-第一单元
  2. docker linux界面版,centos 7 Docker使用Portainer搭建可视化界面
  3. python写一个表白程序-用Python写一个表白神器让你脱单
  4. 智能的定义是什么?如何正确理解智能家居?
  5. Codeforces1019C
  6. iOS网络加载图片缓存策略之ASIDownloadCache缓存优化
  7. Babel的使用及其工作原理
  8. 【Spring Boot】Spring Boot之整合RabbitMQ并实现消息的发送和接收
  9. centos7下Jenkins管理员admin密码忘记后处理方法
  10. 向量的范数(有例子,简单好理解)
  11. Java入门之继承,学会之后继承直接ok!!!超详细!!!
  12. 华为云医疗智能体,助力医疗健康加速智能化
  13. 基于Redis实现在线游戏积分排行榜
  14. 重装系统(win7)
  15. OpenHarmony之系统功能框架分析
  16. electron-edge 打印助手
  17. photoshop图像处理用钱吗_PS图像处理的流程与方法
  18. 什么是高防IP?高防IP工作原理是什么?
  19. 使用OneNote的COM组件,实现OCR功能。
  20. windows系统不知道读音如何使用搜狗输入法快速打出生僻字

热门文章

  1. 运用背景橡皮擦抠透明郁金香
  2. TimLiu-iOS
  3. 使用IDEA打包程序到jar包
  4. 蓝桥杯Java——安装软件Eclipse以及JDK
  5. IDEA plugins插件下载速度慢
  6. JSON获取数组——读完你就读懂了JSON
  7. leetcode系列-116.填充每个节点的下一个右侧节点指针
  8. 阿里体育早起打卡服务器无响应,帮你解决无法早起的焦虑-顺便撸羊毛
  9. 孟岩:为何智能合约没能成为区块链的杀手级应用?
  10. Atitit.播放系统规划新版本 and 最近版本回顾 v3  pbf.doc  1 版本11 (ing)41.1 规划h5本地缓存系列 41.2 Android版本app41.3 双类别系统,...