图像处理库(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)的张量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL-事务

set autocommit 0; select * from acount where name 嘉宝 && acount.money > 1000; update acount set money money - 1000 where name 嘉宝; update acount set money money 1000 where name 煎包; commit ; 脏读;当有两个事务使用同一数据库时&#xff0c…

SQL SERVER使用发布订阅同步数据库遇到的坑

可能遇到的各种坑 1.在执行 xp_cmdshell 的过程中出错。调用 ‘CreateProcess’ 失败,错误代码: ‘5’ 网上有各种解决办法,包括改本地安全策略,将sql server服务的网络权限改为本机系统,改cmd用户的读写权限,退出360…

基于WSL2、Ubuntu和VS Code的CUDA平台运行C语言程序

一、CUDA程序执行方法 执行步骤为: 安装Visual Studio Code。在Visual Studio Code中安装插件WSL与电脑的WSL2进行连接。点击左下角,然后再选择连接到WSL。 在WSL中创建以 .cu 为后缀的文件。 rootDESKTOP-HR6VO5J:~# mkdir CUDA /…

【NLP-新工具】语音转文本与OpenAI的用途

一、说明 OpenAI最近2022发布了一个名为Whisper的新语音识别模型。与DALLE-2和GPT-3不同,Whisper是一个免费的开源模型。它的主要功能就是将语音翻译成文本。本文将介绍如何使用这个重要应用库。 二、 Whisper概念 2.1 Whisper是啥? Whisper 是一种自动…

Linux实战:五子棋

一、五子棋原理 采用二维数组保存棋盘信息,棋盘上面的任何一个位置,里面可以放置三类信息。 空用户1的落子(黑子)用户2的落子(白子)下棋就是在二维数组中找对应的空位置,进行落子落完子之后下来就要考虑该落子位置是否有”五子连珠“,进而进行输赢判定,每一次走棋,多…

selenium如何打开浏览器,等待用户输入完成后,再运行

selenium如何打开浏览器,等待用户输入完成后,再运行 一、在脚本中,等待用户输入 在使用 Selenium 打开浏览器后等待用户输入完成,可以使用 Python 编写一个简单的脚本来实现。首先,确保你已经安装了 Selenium 和对应的…

数据结构与算法

时间复杂度和空间复杂度 时间复杂度大 O 表示法:表示代码执行时间随这数据规模增大的变化趋势。 空间复杂度大 O 表示法:表示代码占用的存储空间随数据规模增大的变化趋势。 数组 编程语言中一般会有数组这种数据类型。不过,它不仅是编程…

【JAVASE】类与对象

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 类与对象 1. 面向对象1.1 什么是面向对象…

Cordova+Vue2.0打包apk,保姆教程来袭!

1.环境准备(全部都需要配置环境变量) java version "1.8.0_341" 安卓sdk android-29 Gradle 4.10.1 node v16.16.0 cordova 10.0.0 (cordova-lib10.1.0)2.安卓环境变量 1. 确认已安装 Android SDK Build-Tools 和 Android SDK Platform-Tool…

QMLDay2:圆角按钮,关联键盘左右键,鼠标点击。状态切换控制。

QMLDay2 test1 作用: 圆角按钮,关联键盘左右键,鼠标点击。状态切换控制。 代码: import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truecolor: "wh…

mysql--InnoDB存储引擎--架构和事务

MySQL进阶篇 文章目录 架构1、逻辑结构InnoDB 逻辑存储单元主层级关系图:1、表空间2、段3、区4、页5、行总结: 2、架构2、1 内存架构2、2 磁盘架构 3、事务3、1事务基础(1)事务(2)特性 架构 1、逻辑结构 I…

IO进线程——库的制作(静态库、动态库)

库的制作 1、静态库 ①生成二进制文件 gcc -c linkstack.c -o linkstack.o②制作静态库文件,把.o文件转换为.a文件 ar crs liblinkstack.a linkstack.o③编译时链接 gcc linkstack_main.c -L. -llinkstack2、动态库 ①生成地址无关二进制文件 gcc -fPIC -c l…

实现 rollup 实现多模块打包

rollup 是一个 JavaScript 模块打包器,可以将许多 JavaScript 库和应用程序打包成少量的捆绑包,从而提高了应用程序的性能。本文详细描述如何通过 rollup 实现多模块打包。 前提 项目的目录结构 先看下项目的 package.json 文件夹: {&qu…

我的 365 天创作纪念日

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

【Unity造轮子】实现一个类csgo的武器轮盘功能

文章目录 前言素材导入开始1.放背景和中间的圆圈,调整合适的宽高和位置2.添加选择图像框3.添加一些武器道具选择4.书写脚本RadialMenuManager5.绑定脚本和对象6.运行效果,按tab键开启关闭轮盘7.优化添加显示选中的武器文本8.添加鼠标选中放大的效果9.添加…

MySQL和Oracle区别

由于SQL Server不常用,所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮 (2) 分页查询 MySQL是直接在SQL…

JIT 与 C#热更

JIT与AOT 一般程序运行有两种方式,静态编译与动态编译。 AOT: Ahead Of Time,预先(静态)编译 静态编译的程序,需要在执行之前全部翻译为机器码,运行前会使得程序安装时间相对较长,但程序运行的时候&#…

加载已训练好的目标检测YOLOv8,v5,v3,v6模型,对数据集中某张图片中的object打上方框、标出类别,并将图片保存到本地

参考的教程:Python - Ultralytics YOLOv8 Docs 在与ultralytics代码同一层级下新建 predict.py 里面写下面的内容。运行即可 from ultralytics import YOLO from PIL import Image import cv2# 加载计划使用的模型 model YOLO("yolov8n.pt") # load a…

2023年的深度学习入门指南(24) - 处理音频的大模型 OpenAI Whisper

2023年的深度学习入门指南(24) - 处理音频的大模型 OpenAI Whisper 在这一讲之前,我们所用的大模型都是针对文本的。这一讲我们增加一个新的领域,即音频。我们将介绍OpenAI的Whisper模型,它是一个处理音频的大模型。 Whisper模型的用法 Wh…

Qt信号与槽机制的本质

引入 对象与对象之间的通信有多个方式,如果我们要提供一种对象之间的通信机制。这种机制,要能够给两个不同对象中的函数建立映射关系,前者被调用时后者也能被自动调用。 再深入一些,两个对象如果都互相不知道对方的存在&#xff…