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

news2024/11/13 16:02:55

文章目录

  • 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 inline

def 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_mat

def mat2cv(img_mat): # 将颜色通道从RGB改变成BGR
	img_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.0
	return 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.coloradmin.cn/o/824596.html

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

相关文章

Sql server 2005 卸载之后重新安装

Sql server 2005 卸载之后重新安装 Sql sercer 2005在重新安装之前先要进行卸载操作,由于Sql sercer 2005组件都是分散的,所以卸载时要找到对应的位置一个一个卸载,不卸载干净的情况下再次安装时会出现很多问题,导致安装失败。这…

KubeSphere部署芋道源码ruoyi-vue-pro

KubeSphere环境准备 新建企业空间 新建项目 创建harbor镜像服务信息 新建DevOps 项目 创建git,harbor,kubeconfig凭证 中间件部署 MySQL8部署redis6部署 后端部署 修改pom.xml <!-- pom.xml添加内容&#xff1a;--> <profiles><!-- 本地环境 --><pro…

《当今奇人周兴和》励志小说连载之三 ● 饥饿寒冷童年梦

饥饿寒冷童年梦 Hungry and cold childhood 兴和至今也记得&#xff0c;这年冬天特别冷。 Xinghe still remembers that the winter was particularly cold in that year. 那一天&#xff0c;放了学的小兴和背着书兜&#xff0c;又冷又饿地从毛公乡小学出来&#xff0c;艰难…

渠道控价的常见方法

品牌渠道一般分为线上和线下&#xff0c;现在常见要治理的渠道一般指的是线上&#xff0c;因为线上渠道数据变化快&#xff0c;价格波动也很大&#xff0c;促销信息有很多&#xff0c;如果遇到大促&#xff0c;涉及的价格变化将会更明显&#xff0c;所以线上渠道是非常值得控价…

OA办公自动化系统设计与实现(论文+源码)_kaic

摘要 随着信息化建设的日益深入&#xff0c;无论是政府还是企事业单位&#xff0c;部门之间的信息沟通与协调工作越来越重要。人们迫切需要一个能充分利用网络优势&#xff0c;并可以管理企业的各种重要信息的软件平台&#xff0c;利用该平台快速建立自己的信息网络和办公管理系…

华为PMS API client token auth failed

对接华为pms时出现问题&#xff0c;提示华为PMS API client token auth failed 主要是权限的问题&#xff0c;创建项目的时候选择N/A

u盘数据不知道什么时候全没了怎么恢复

案例&#xff1a;“你好&#xff0c;我发现我的U盘上的所有数据都不知何时消失了&#xff0c;我之前保存了许多重要的文件和照片&#xff0c;U盘数据不知道什么时候全没了怎么恢复&#xff1f;大神你知道么” 随着U盘的广泛应用&#xff0c;数据丢失问题也日益突出。很多人发现…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 4

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

chrome扩展在popup、background、content之间通信解决传输文件问题

文章目录 背景介绍案例介绍代码示例popup页面&#xff0c;上传文件页面popup页面&#xff0c;js上传代码&#xff0c;file文件转base64background监听消息&#xff0c;base64转file文件&#xff0c;axios上传 附-转base64后直接下载 背景介绍 示例扩展API版本MV2。 以弹…

Linux下安装配置Redis

文章目录 安装依赖库上传安装包并解压 启动默认启动指定配置启动开机自启 安装 依赖库 Redis是基于C语言编写的&#xff0c;因此首先需要安装Redis所需要的gcc依赖&#xff1a; yum install -y gcc tcl上传安装包并解压 将Redis安装包上传到服务器的任意目录&#xff0c;例…

使用WebMvcConfigurationSupport后导致原来返回的json数据变为了xml的解决方法

问题 未使用WebMvcConfigurationSupport拦截时返回的数据都是JSON格式&#xff0c;使用WebMvcConfigurationSupport做拦截后数据的返回变为了XML的格式。 原因 在Spring框架中&#xff0c;WebMvcConfigurationSupport 是一个类&#xff0c;它可以用于自定义Spring MVC的配置…

【word密码】如何解密word密码?

Word文档常见的两种加密方式&#xff0c;打开密码和限制编辑&#xff0c;这两种密码对word文档加密&#xff0c;今天我们来讲一下这三种加密如何解密 解密一&#xff1a;打开密码 设置了打开密码的word文件&#xff0c;想要解密&#xff0c;我们需要先输入密码进入到文件当中…

IO进程线程第四天(8.1)opendir,closedir,readdir

作业1&#xff1a; 从终端获取一个文件的路径以及名字。 若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹 若该文件不是目录文件&#xff0c;则显示该文件的属性到终端上&#xff0c;类似ls -l这单个文件 #include<…

华为OD机试真题 JavaScript 实现【箱子之形摆放】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例…

【Uniapp 中实现微信登录】

要在 Uniapp 中实现微信登录&#xff0c;需要完成以下步骤&#xff1a; 在微信开放平台注册一个应用&#xff0c;并获取到该应用的 AppID 和 AppSecret。 在 manifest.json 中点击App模块配置。勾选微信登录模块&#xff0c;填入该应用的 AppID 在代码中调用 uni.login 方法&…

学习记录——EGE-UNet、CFNet

EGE-UNet: an Efficient Group Enhanced UNet for skin lesion segmentation 上海交大 2023 MICCAI 基于 U-Net 进行魔改&#xff0c;用于解决医学图像&#xff08;尤其是皮肤病变&#xff09;分割中面临的问题。由于它是针对移动健康应用开发的&#xff0c;解决了当前许多模型…

docker下载镜像慢

下载镜像的方法 手动下载&#xff0c;然后再打开 此方法有局限&#xff0c;因为不是所有的镜像地址都支持http访问。 方法是打开此镜像市场网站&#xff0c;搜索自己想要的镜像&#xff0c;然后点击下载即可。 Linux一般是下载一个压缩包&#xff0c;解压之后docker load就可…

用于医学图像分类的双引导的扩散网络

文章目录 DiffMIC: Dual-Guidance Diffusion Network for Medical Image Classification摘要本文方法实验结果 DiffMIC: Dual-Guidance Diffusion Network for Medical Image Classification 摘要 近年来&#xff0c;扩散概率模型在生成图像建模中表现出了显著的性能&#xf…

【update】自动更新设计小记

前情纪要 老项目的一个更新迭代实例方式处理&#xff0c;从功能梳理&#xff0c;待流程设计,…了解功能&#xff0c;时序图&#xff0c;流程图记录 关系图梳理 流程图设计

ChatGPT及其工作原理;OpenAI申请注册商标GPT-5,引发关注

&#x1f989; AI新闻 &#x1f680; OpenAI申请注册商标GPT-5&#xff0c;引发关注 摘要&#xff1a;OpenAI已在上月18日申请注册商标GPT-5&#xff0c;显示该模型将提供文本生成、自然语言理解、语音转录、翻译、分析等功能。此前OpenAI曾表示尚未开始训练GPT-4的后继者GPT…