当前位置: 首页 > news >正文

图像处理库(Opencv, Matplotlib, PIL)以及三者之间的转换

文章目录

  • 1. Opencv
  • 2. Matplotlib
  • 3. PIL
  • 4. 三者的区别和相互转换
  • 5. Torchvision 中的相关转换库
    • 5.1 ToPILImage([mode])
    • 5.2 ToTensor
    • 5.3 PILToTensor

1. Opencv

opencv的基本图像类型可以和numpy数组相互转化,因此可以直接调用torch.from_numpy(img) 将图像转换成tensor

  • 读取: img=cv2.imread(path)
    OpenCV读取图像后返回的是一个代表图像的numpy.ndarray,采用的格式是(H,W,C),通道顺序为BGR, 取值范围[0,255], dtype=uint8
import cv2
def read_img_cv(path):img_cv=cv2.imread(path)return img_cv
  • 显示: cv2.imshow(name,img)
import cv2
def show_img_cv(img_cv):cv2.imshow("Image", img_cv)cv2.waitKey(0)  # 暂停显示图片,数字0代表按键后 0 ms执行
  • 保存: cv2.imwrite(path, img)
import cv2
def save_img_cv(img_cv,path):cv2.imwrite(path, img_cv)  # 保存图片

2. Matplotlib

matplotlib 是python仿照matlab绘图开发的图像绘制库。使用matplotlib绘图时,可以读取tesnornumpy数据类型。

  • 读取: img=mpimg.imread(path)

如果是灰度图:返回(H,W)形状的数组
如果是RGB图像,返回(H, W, 3) 形状的数组,图片通道顺序为RGB
如果是RGBA图像,返回(H.W, 4) 形状的数组, 图片通道顺序为RGBA

此外,PNG 图像以浮点数组 (0-1) dtype=float32的形式返回,所有其他格式都作为 int 型数组dtype=uint8返回,位深由具体图像决定。

import matplotlib.image as mpimg
def read_img_mat(path):img_mat=mpimg.imread(path)return img_mat
  • 显示: plt.imshow(img) plt.show()
  1. 显示彩色图
import matplotlib.pyplot as plt
# 如果在jupyter notebook中显示,需要添加如下一行代码
%matplotlib inlinedef show_img_mat(img_mat):plt.imshow(img_mat)plt.axis('off')plt.show()
  1. 显示灰度图
    matplotlib显示图像,默认以三通道显示图像,我们需要在plt.imshow()里添加参数gray
def show_img_gray(img_gray):plt.imshow(img_gray,cmap='gray')plt.axis('off')plt.show()
  1. 显示Image类型图片
def show_img_pil(img_pil):plt.imshow(img_pil)plt.axis('off')plt.show()
  • 保存: plt.imsave(name,img)
def save_img_pil(img_pil,name):plt.imsave(name,img_pil)

3. PIL

PIL是python对于图像处理的基本库。
图像的模式如下图,比如1: 二值图,L灰度图,P: 8位彩色图,RGB:24位彩色图(每个通道8位)例如jpg图像,RGBA : 相比RGB多了alpha通道(不透明度)例如png图像
可以使用img.convert(mode) 转换模式。
在这里插入图片描述

  • 读取: img=Image.open(path)
    读到的是一个PIL.xxxImageFIie的类型。
import PIL
from PIL import Image
def read_img_pil(path):img_pil=Image.open(path) # PIL Image 类型return img_pil
  • 显示:image.show()
def show_img_pil(img_pil):img_pil.show()
  • 保存: image.save(path)
def save_img_pil(img_pil,path):img_pil.save(path)

4. 三者的区别和相互转换


三者的区别

  • Opencv 的数据类型是Numpy数组,通道顺序为BGR
  • Matplotlib 的数据类型是Numpy数组, 通道顺序是RGB
  • PIL 的数据类型是PIL.Image类,通道顺序是RGB

三种图像处理库相互转换

  • OpencvMatplotlib之间的相互转换
# cv->mat
def cv2mat(img_cv):img_mat=cv2.cvtColor(img_cv,cv2.COLOR_BGR2RGB) # 将颜色通道从BGR改变成RGB# 另一种等价写法# img_mat=img_cv[:,:,::-1]return img_matdef mat2cv(img_mat): # 将颜色通道从RGB改变成BGRimg_cv=img_mat[:,:,::-1]return img_cv
  • MatplotlibPIL之间的相互转换
    np.asarry(img) img->array
    Image.fromarray(array) array->img
# mat->PIL
#方法1:三通道的转换
def mat2PIL_RGB(img_mat):img_pil=Image.fromarray(img_mat.astype('uint8'))# unit8 是无符号的8位整形,用astype [0,255]截断处理# 另外一种写法# img_pil= Image.fromarray(np.unit8(img_mat))return img_pil # 方法2: 四通道的转换
def mat2PIL_RGBA(img_mat):img_pil=Image.fromarray(img_mat.astype('uint8')).convert('RGB')return img_pil# 方法三:使用torchvision的库函数
from torchvision import transforms
def mat2PIL_trans(img_mat):trans=transformers.ToPILImage()img_pil=trans(img_mat)return img_pil'''PIL->mat'''def PIL2mat(img_pil):img_mat=np.array(img_pil) # 深拷贝# 如果是jpg格式,通道顺序是RGB, (H,W,3)# 如果是png格式,通道顺序是RGBA, (H,W,4)# 返回的类型均是`numpy.ndarray`, `dtype=unit8`, 取值返回[0,255]# 或者也可以采用浅拷贝# img_mat=np.asarray(img_pil)return img_mat'''区间变换'''
# [0,255]->[0,1] 
def PIL2mat_norm(img_pil):img_mat=np.asarray(img_pil)/255.0return img_mat
# [0,1]->[0,255]
def mat_255(img_mat):img_mat=(np.maximum(img_mat, 0) / img_mat.max()) * 255.0 img_mat=np.unit8(img_mat)
  • OpencvPIL之间的相互转换
# cv->PIL
#方法1:三通道的转换
def cv2PIL_RGB(img_cv):img_rgb = img_cv[:,:,::-1] # OpenCV 的通道顺序为 BGR, 转换成RGB# nparray img_pil= Image.fromarray(np.uint8(img_rgb))return img_pil # 方法2: 四通道的转换
def cv2PIL_RGBA(img_cv):img_rgb = img_cv[:,:,::-1]img_pil=Image.fromarray(img_rgb.astype('uint8')).convert('RGB')return img_pil# 方法三:使用torchvision的库函数
from torchvision import transforms
def cv2PIL_trans(img_cv):img_rgb = img_cv[:,:,::-1]trans=transformers.ToPILImage()img_pil=trans(img_rgb)return img_pil# PIL->cv
def PIL2cv(img_pil):img_ary=np.array(img_pil) # 深拷贝,通道顺序是 RGB, (H,W,C)# 或者也可以采用深拷贝# img_ary=np.asarray(img_pil)img_cv=img_ary[:,:,-1]return img_cv

三种格式和Tensor之间的相互转换

  • numpy格式转成Tensor
import torch
def nparray2tensor(npary):ts=torch.from_numpy(npary)# 如果需要修改成浮点类型# ts=torch.from_numpy(npary).float()return ts
  • PIL和numpy格式转成Tensor
    可以利用torchvision 中transforms.ToTensor()
    该函数可以将PIL 中的Image 或者 numpy.ndarray(dtype=unit8): 大小 (H,W,C) 、范围[0,255] 转化成torch.FloatTensor: 大小(C,H,W)、范围[0.0,1.0]
from torchvision import transforms
# img_pil: Image
trans=transforms.ToTensor() 
tens=trans(img_pil) # (C,H,W) [0.0,1,0]
# tens_hwc=tens.transpose((1,2,0))

5. Torchvision 中的相关转换库

5.1 ToPILImage([mode])

CLASS
torchvision.transforms.ToPILImage(mode=None)
  • 功能

    将tensor或ndarray转换为PIL图像——这不会缩放值。这个转换不支持torchscript。

    转换形状为C x H x Wtorch.*Tensor或形状为H x W x Cnumpy ndarrayPIL图像,同时保留值范围。

  • 参数

    • mode(PIL.Image mode) 输入数据的颜色空间和像素深度(可选)。mode为None时(默认)对输入数据有如下假设 :
      • 输入为4通道时,假设模式为RGBA。
      • 如果输入为3通道,则假设为RGB模式。
      • 输入为2路时,假设为LA模式。
      • 如果输入有1个通道,模式由数据类型(即int、float、short)确定。

5.2 ToTensor

CLASS
torchvision.transforms.ToTensor
  • 功能:

    将PIL图像或ndarray转换为tensor,并相应地缩放。这个转换不支持torchscript。

    转换PIL Image或在[0,255]区间内的numpy.ndarray (H x W x C)[0.0,1.0]区间内的torch.FloatTensor (C x H x W)。其中PIL Image属于其中一种模式(L, LA, P, I, F, RGB, YCbCr, RGBA, CMYK, 1);如果numpy.Ndarray的dtype = np.uint8
    在其他情况下,张量在不缩放的情况下返回。

5.3 PILToTensor

CLASS
torchvision.transforms.PILToTensor
  • 功能

    将PIL图像转换为相同类型的张量-这不会缩放值。这个转换不支持torchscript。

    PIL Image (H x W x C)转换为形状(C x H x W)的张量。

相关文章:

图像处理库(Opencv, Matplotlib, PIL)以及三者之间的转换

文章目录 1. Opencv2. Matplotlib3. PIL4. 三者的区别和相互转换5. Torchvision 中的相关转换库5.1 ToPILImage([mode])5.2 ToTensor5.3 PILToTensor 1. Opencv opencv的基本图像类型可以和numpy数组相互转化,因此可以直接调用torch.from_numpy(img) 将图像转换成t…...

html+Vue+封装axios实现发送请求

在html中使用Vue和Axios时&#xff0c;可以在HTML中引入Vue库和Axios库&#xff0c;然后使用Vue的语法和指令来创建Vue组件和模板。在Vue组件中&#xff0c;你可以使用Axios发送HTTP请求来获取数据&#xff0c;并将数据绑定到Vue模板中进行展示。 <template><div>&…...

GoogLeNet卷积神经网络输出数据形参分析-笔记

GoogLeNet卷积神经网络输出数据形参分析-笔记 分析结果为&#xff1a; 输入数据形状:[10, 3, 224, 224] 最后输出结果&#xff1a;linear_0 [10, 1] [1024, 1] [1] 子空间执行逻辑 def forward_old(self, x):# 支路1只包含一个1x1卷积p1 F.relu(self.p1_1(x))# 支路2包含 1…...

【docker】dockerfile发布springboot项目

目录 一、实现步骤二、示例 一、实现步骤 1.定义父镜像&#xff1a;FROM java:8 2.定义作者信息&#xff1a;MAINTAINER&#xff1a;learn_docker<https://www.docker.com> 3.将jar包添加到容器&#xff1a;ADD jar包名称.jar app.jar 4.定义容器启动执行命令&#xff1a…...

利用docker run -v 命令实现使用宿主机中没有的命令

利用docker run -v 命令实现使用宿主机中没有的命令 使用容器中的jar命令解压jar包&#xff0c;并将解压内容输出到挂载在宿主机中的目录里 使用容器中的jar命令解压jar包&#xff0c;并将解压内容输出到挂载在宿主机中的目录里 docker run -it --name java -v /www/temp/java…...

【小沐学NLP】在线AI绘画网站(百度:文心一格)

文章目录 1、简介2、文心一格2.1 功能简介2.2 操作步骤2.3 使用费用2.4 若干示例2.4.1 女孩2.4.2 昙花2.4.3 山水画2.4.4 夜晚2.4.5 古诗2.4.6 二次元2.4.7 帅哥 结语 1、简介 当下&#xff0c;越来越多AI领域前沿技术争相落地&#xff0c;逐步释放出极大的产业价值&#xff0…...

react经验5:访问子组件内容

应用场景 父级需要调用子组件的某函数 实现步骤 案例&#xff1a;创建自定义按钮 button.tsx import { Ref, forwardRef, useImperativeHandle,ReactNode} from "react" declare type ButtonProps {/**按钮文字 */children?: ReactNode,onClick?: () > voi…...

【LeetCode】647. 回文子串

题目链接 文章目录 1. 思路讲解1.1 方法选择1.2 dp表的创建1.3 状态转移方程1.4 填表顺序 2. 代码实现 1. 思路讲解 1.1 方法选择 这道题我们采用动态规划的解法&#xff0c;倒不是动态规划的解法对于这道题有多好&#xff0c;它并不是最优解。但是&#xff0c;这道题的动态…...

Open3D(C++) 角度制与弧度制的相互转换

目录 一、弧度转角度1、计算公式2、主要函数3、示例代码4、结果展示二、角度转弧度1、计算公式2、主要函数3、示例代码4、结果展示三、归一化到(-PI,PI)1、主要函数<...

【小沐学NLP】在线AI绘画网站(网易云课堂:AI绘画工坊)

文章目录 1、简介1.1 参与方式1.2 模型简介 2、使用费用3、操作步骤3.1 选择模型3.2 输入提示词3.3 调整参数3.4 图片生成 4、测试例子4.1 小狗4.2 蜘蛛侠4.3 人物4.4 龙猫 结语 1、简介 Stable Diffusion是一种强大的图像生成AI&#xff0c;它可以根据输入的文字描述词&#…...

GNN code Tips

1. 重置label取值范围 problem: otherwise occurs IndexError: target out of bounds # reset labels value range, otherwise occurs IndexError: target out of bounds uni_set torch.unique(labels) to_set torch.tensor(list(range(len(uni_set)))) labels_reset label…...

物联网|按键实验---学习I/O的输入及中断的编程|函数说明的格式|如何使用CMSIS的延时|读取通过外部中断实现按键捕获代码的实现及分析-学习笔记(14)

文章目录 通过外部中断实现按键捕获代码的实现及分析Tip1:函数说明的格式Tip2:如何使用CMSIS的延时GetTick函数原型stm32f407_intr_handle.c解析中断处理函数&#xff1a;void EXTI4_IRQHandler 调试流程软件模拟调试 两种代码的比较课后作业: 通过外部中断实现按键捕获代码的实…...

Java对象的前世今生

文章目录 一、创建对象的步骤二、类加载机制三、内存分配指针碰撞 (内存连续)空闲列表 (内存不连续) 四、创建对象的5种方法五、浅拷贝与深拷贝 以下一行代码内部发生了什么&#xff1f; Person person new Person();一、创建对象的步骤 根据JLS中的规定&#xff0c;Java对象…...

Qt中JSON的使用

一.前言&#xff1a; JSON是一种轻量级数据交换格式&#xff0c;常用于客户端和服务端的数据交互&#xff0c;不依赖于编程语言&#xff0c;在很多编程语言中都可以使用JSON&#xff0c;比如C&#xff0c;C&#xff0c;Java&#xff0c;Android&#xff0c;Qt。除了JSON&#x…...

linux安装Tomcat部署jpress教程

yum在线安装&#xff1a; 查看tomcat相关的安装包&#xff1a; [rootRHCE ~]# yum list | grep -i tomcat tomcat.noarch 7.0.76-16.el7_9 updates tomcat-el-2.2-api.noarch 7.0.76-16.el7_9 updat…...

高并发负载均衡---LVS

目录 前言 一&#xff1a;负载均衡概述 二&#xff1a;为啥负载均衡服务器这么快呢&#xff1f; ​编辑 2.1 七层应用程序慢的原因 2.2 四层负载均衡器LVS快的原因 三&#xff1a;LVS负载均衡器的三种模式 3.1 NAT模式 3.1.1 什么是NAT模式 3.1.2 NAT模式实现LVS的缺点…...

微前端中的 CSS

本文为翻译 本文译者为 360 奇舞团前端开发工程师原文标题&#xff1a;CSS in Micro Frontends 原文作者&#xff1a;Florian Rappl 原文地址&#xff1a;https://dev.to/florianrappl/css-in-micro-frontends-4jai 我被问得最多的问题之一是如何在微前端中处理 CSS。毕竟&…...

在CSDN学Golang场景化解决方案(分布式日志系统)

一&#xff0c;传统 elk 解决方案及其弊端 传统ELK&#xff08;Elasticsearch Logstash Kibana&#xff09;方案是一种流行的分布式日志系统解决方案&#xff0c;但也存在一些弊端&#xff1a; 依赖性&#xff1a;ELK使用Java编写&#xff0c;需要安装JVM&#xff0c;并且还…...

电脑第一次使用屏幕键盘

操作流程 1.在键盘上同时按WinR打开运行; 2.输入control 3.找到设置中心 4.点击屏幕键盘 效果 具体怎么使用 我不咋清除 简单 测试了一下 可以用鼠标点击屏幕键盘的按键 用键盘 按字母键和数字键 是和屏幕键盘不同步的 其他 tab、shift、后退、enter好像同步...

【C#学习笔记】类型转换

文章目录 类型转换字符转数字GetNumericValueConvert.ToInt32隐式转换计算 字符串转数字Parse 或 TryParse 方法 字节数组转整数 as&#xff0c;is强制类型转换isas 用户定义的转换 类型转换 我们简单地将值类型分为5种&#xff1a;整数型&#xff0c;浮点型&#xff0c;布尔型…...

ENSP USG6000防火墙CPU占用飙到99%?可能是你的“小云朵”网卡选错了(VMware网卡避坑指南)

ENSP USG6000防火墙CPU占用率优化实战&#xff1a;VMware虚拟网卡配置全解析 当你在ENSP中成功启动USG6000防火墙后&#xff0c;是否遭遇过整个系统突然变得异常卡顿&#xff1f;打开任务管理器&#xff0c;发现ENSP进程的CPU占用率直逼99%&#xff0c;仿佛你的电脑正在执行某种…...

明日方舟自动化助手MAA:3步解放双手,让游戏回归乐趣

明日方舟自动化助手MAA&#xff1a;3步解放双手&#xff0c;让游戏回归乐趣 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: ht…...

【MATLAB源码-第439期】基于MATLAB的APSK与QAM高阶调制在Saleh非线性功放下BER和EVM性能对比

操作环境&#xff1a;MATLAB 2024a1、算法描述摘要 高阶数字调制技术是现代无线通信和卫星通信系统提高频谱利用率的重要方法。QAM 调制通过同相分量和正交分量的幅度组合形成二维星座&#xff0c;在较高信噪比条件下能够获得较高的信息承载能力。APSK 调制则采用多环幅相结构&…...

从ARM Cortex-M到FPGA:手把手教你用AXI4-Lite搭建自定义外设(以Zynq-7000为例)

从ARM Cortex-M到FPGA&#xff1a;用AXI4-Lite实现自定义外设的工程实践 在嵌入式系统开发中&#xff0c;处理器与可编程逻辑的高效协同一直是提升性能的关键路径。当标准外设无法满足特定需求时&#xff0c;工程师往往需要在FPGA中设计定制硬件模块&#xff0c;并通过标准化总…...

TS9580,TS3440,TS3400,G3000,G1810,G2810,G3810,G4810,TS9020,TS9120报错5B00,P07,E08,1700,5b04废墨垫清零,亲测有用。

下载&#xff1a;点这里下载 备用下载&#xff1a;https://pan.baidu.com/s/1WrPFvdV8sq-qI3_NgO2EvA?pwd0000 常见型号如下&#xff1a; G系列 G1000、G1100、G1200、G1400、G1500、G1800、G1900、G1010、G1110、G1120、G1410、G1420、G1411、G1510、G1520、G1810、G1820、…...

别再傻傻等下载了!QMT历史数据获取的3个高效技巧(含xtquant代码示例)

QMT历史数据获取效率优化实战&#xff1a;3个让回测提速200%的高级技巧 每次打开QMT准备回测策略时&#xff0c;最让人抓狂的莫过于漫长的历史数据等待时间。作为一名量化研究员&#xff0c;我曾在数据准备环节浪费了无数个下午——直到发现这几个能彻底改变工作流的技巧。本文…...

跨国设计大文件同步延迟高?企业网盘选型必须知道的 3 个标准(含 5 款网盘实测)

对于跨国运作的设计与研发团队而言&#xff0c;最折磨人的往往不是时差&#xff0c;而是等待一个 2GB 的大型工程文件&#xff08;PSD、CAD 或项目源文件&#xff09;缓慢同步的“沙漏时长”。国外团队昨晚做好的模型&#xff0c;国内团队早上还要等一个小时才能下载完毕&#…...

高级磁盘空间管理:WinDirStat深度配置与自动化清理指南

高级磁盘空间管理&#xff1a;WinDirStat深度配置与自动化清理指南 【免费下载链接】windirstat WinDirStat is a disk usage statistics viewer and cleanup tool for Microsoft Windows 项目地址: https://gitcode.com/gh_mirrors/wi/windirstat 在当今数据爆炸的时代…...

备战蓝桥杯国赛【Day 17】

&#x1f4cc; 写在前面&#xff1a;今天的4道题全部来自蓝桥杯真题&#xff0c;&#xff0c;核心考点包括&#xff1a;贪心策略排序、自定义比较器、差分思想、前缀和贪心选择。这些题目看似简单&#xff0c;但暗藏陷阱&#xff0c;是检验"代码实现能力"和"思维…...

STM32 HAL库实战:用CD74HC4067扩展模拟输入通道,附完整工程代码

STM32 HAL库实战&#xff1a;用CD74HC4067扩展模拟输入通道&#xff0c;附完整工程代码 在嵌入式开发中&#xff0c;模拟信号采集是常见需求&#xff0c;但MCU内置ADC通道数量往往有限。当面对多路传感器信号采集时&#xff0c;如何经济高效地扩展输入通道成为开发者必须解决的…...