PIL.Image, numpy, tensor, cv2 之间的互转,以及在cv2在图片上画各种形状的线
'''
PIL.Image, numpy, tensor, cv2 之间的互转
'''
import cv2
import torch
from PIL import Image
import numpy as np
from torchvision import transforms
img_path='catdog.jpg'
img_PIL = Image.open(img_path).convert('RGB') # plt读取的是单通道
print(type(img_PIL)) # <class 'PIL.Image.Image'>
# im.show()
'''
PIL.Image --> numpy
'''
img_numpy = np.array(img_PIL)
print(type(img_numpy)) # <class 'numpy.ndarray'>
'''
numpy --> PIL.Image
'''
# img = img[:,:,0] #第1通道
img_PIL=Image.fromarray(img_numpy)
print(type(img_PIL)) # <class 'PIL.Image.Image'>
'''
PIL.Image --> tensor
'''
transform = transforms.Compose([transforms.ToTensor()])
img_tensor = transform(img_PIL)
print(type(img_tensor)) # <class 'torch.Tensor'>
'''
tensor --> PIL.Image
'''
img_PIL = transforms.ToPILImage()(img_tensor).convert('RGB')
print(type(img_PIL)) # <class 'PIL.Image.Image'>
'''
tensor --> numpy
'''
img_numpy = img_tensor.numpy()
print(type(img_numpy)) # <class 'numpy.ndarray'>
'''
numpy --> tensor
'''
img_tensor = torch.from_numpy(img_numpy)
print(type(img_tensor)) # <class 'torch.Tensor'>
'''
cv2(numpy) --> tensor
'''
# opencv读取出来就是numpy形式的,并且是三通道
# 因此opencv与PIL.Image, tensor的格式转换和numpy与PIL.Image, tensor的格式转换一样
img_cv = cv2.imread(img_path)
print(type(img_cv)) # <class 'numpy.ndarray'>
img_tensor = torch.from_numpy(img_cv)
print(type(img_tensor)) # <class 'torch.Tensor'>
'''
cv2(numpy) --> PIL.Image
'''
img_PIL = Image.fromarray(img_cv,mode="RGB")
print(type(img_PIL)) # <class 'PIL.Image.Image'>
# 下面cv2在图像上画线转载自:https://www.cnblogs.com/sunnyCx/p/8136275.html
img=cv2.imread(img_path)
# 给图片画线
# 参数分别表示,起始和终止点的坐标,线的颜色,最后一个参数可以不填,代表线的粗细
# 线的颜色使用BGR表示,越大代表成分越多,红(0,0,255),白(255,255,255)
cv2.line(img, (0, 0), (150, 150), (0, 0, 255), 10)
# 给图片画矩形
# 参数分别表示,左上和右下点的坐标,颜色,粗细
cv2.rectangle(img, (15, 25), (200, 100), (0, 255, 0), 2)
# 圆形,指定中心点和半径 -1表示填充,默认不填充
cv2.circle(img, (100, 63), 55, (255, 0, 0), -1)
# 多边形,指定一个数组代表各个点
# True代表第一个点和最后一个点是否连线
pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
cv2.polylines(img, [pts], True, (0, 0, 255))
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
PIL.Image, numpy, tensor, cv2 之间的互转,以及在cv2在图片上画各种形状的线的更多相关文章
- Linux_window与linux之间文件互传,上传下载
window与linux之间文件互传 运行环境:Centos os7 + win8.1 +putty putty:是一个Telnet,ssh,rlogin,纯tcp以及串行接口连接软件,由于linux ...
- 【openssl】利用openssl完成X509证书和PFX证书之间的互转
利用openssl完成X509证书和PFX证书之间的互转 # OpenSSL的下载与安装: 1.下载地址: 官方网址—— https://www.openssl.org/source/ OpenSSL ...
- JavaScript三种数据类型之间的互转
一:number<===>string 数字类型和字符串类型之间的互相转换 number===>string 数字转字符串有三种方式: 1.在数字后面 +“ ”; 2.利用字符串的 ...
- fastjson对象,JSON,字符串,map之间的互转
1.对象与字符串之间的互转 将对象转换成为字符串 String str = JSON.toJSONString(infoDo); 字符串转换成为对象 InfoDo infoDo = JSON.pars ...
- list<Integer>,Integer[],int[]之间的互转(jdk1.8)
偶然在开发过程中需要将int[] 转成 List<Integer>,采用了遍历的方式,写的代码实在太多. List<Integer> list = new ArrayList& ...
- 机器学习进阶-背景建模-(帧差法与混合高斯模型) 1.cv2.VideoCapture(进行视频读取) 2.cv2.getStructureElement(构造形态学的卷积) 3.cv2.createBackgroundSubtractorMOG2(构造高斯混合模型) 4.cv2.morpholyEx(对图像进行形态学的变化)
1. cv2.VideoCapture('test.avi') 进行视频读取 参数说明:‘test.avi’ 输入视频的地址2. cv2.getStructureElement(cv2.MORPH_E ...
- 机器学习进阶-案例实战-答题卡识别判 1.cv2.getPerspectiveTransform(获得投射变化后的H矩阵) 2.cv2.warpPerspective(H获得变化后的图像) 3.cv2.approxPolyDP(近似轮廓) 4.cv2.threshold(二值变化) 7.cv2.countNonezeros(非零像素点个数)6.cv2.bitwise_and(与判断)
1.H = cv2.getPerspectiveTransform(rect, transform_axes) 获得投射变化后的H矩阵 参数说明:rect表示原始的位置左上,右上,右下,左下, tra ...
- 机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)
7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的 ...
- 图片旋转 1. cv2.getRotationMatrix2D(获得仿射变化矩阵) 2. cv2.warpAffine(进行仿射变化)
原文:https://www.cnblogs.com/my-love-is-python/p/10959612.html 1.rot_mat = cv2.getRotationMatrix2D(ce ...
- 机器学习进阶-目标跟踪-KCF目标跟踪方法 1.cv2.multiTracker_create(构造选框集合) 2. cv2.TrackerKCF_create(获得KCF追踪器) 3. cv2.resize(变化图像大小) 4.cv2.selectROI(在图像上框出选框)
1. tracker = cv2.multiTracker_create() 获得追踪的初始化结果 2.cv2.TrackerKCF_create() 获得KCF追踪器 3.cv2.resize(fr ...
随机推荐
- AP渗透测试学习
1.测试指标 2.测试环境 SDK: Java JDK ,Android SDK 工具: 7zip dex2jar jd-gui apktool activity 劫持工具 3. ...
- [笔记]git pull vs git pull --rebase
git pull vs git pull -rebase 背景 最近在实际开发过程,之前一直使用git pull 去更新该分支的代码,之前认为一旦pull 操作产生新的节点是对合并操作的一个记录,但是 ...
- 使用gradle打包springboot项目
这边整理下自己项目使用gradle打jar包的坎坷经历,使用的方式是命令行的方式 首先配置build.gradle跟我一样 plugins { id 'java' id 'org.springfram ...
- 记springBoot一直报Exception authenticating MongoCredential.
项目场景: 场景:继上回docker安装好了mongo,然后自己本地项目尝试搭建使用连接mongo 问题描述: 按照别人写的文章教程一步步操作,最后自己本地尝试连接查询,跳出这个用户权限不够,发生了套 ...
- C# 人脸检测 人脸比对 活体检测 口罩检测 年龄预测 性别预测 眼睛状态检测
基于以下开源软件做了一个Demo GitHub - ViewFaceCore/ViewFaceCore: C# 超简单的离线人脸识别库.( 基于 SeetaFace6 ) 效果 代码 using Sy ...
- parameter常数及常数函数的使用
模型功能 常数在verilog设计中具备特殊的含义 一个可以由编译器进行处理的数 和C语言中常数一个不变的变量的作用不同 在verilog中,常数更多地作为预编译变量以提高设计的灵活性 在上一篇文章中 ...
- verilog之readmemb
verilog之readmemb 1.基本作用 用于读取存储器的值的系统函数.这里首先要知道什么是存储器.在verilog中,有一些比较大的数据是需要存储的,一般需要使用存储器,语法结构类似二维数组. ...
- AXI4的PL与PS联合设计
AXI4的PL与PS联合设计 1.实验原理 在前面的学习中,解决了如何利用一个缓冲寄存器控制另外一个寄存器的输入输出配置.接下来就是如何将PL设计直接导入到PS中实现资源互换.PS是可以通过AXI4总 ...
- OREPA:阿里提出训练也很快的重参数策略,内存减半,速度加倍 | CVPR 2022
论文提出了在线重参数方法OREPA,在训练阶段就能将复杂的结构重参数为单卷积层,从而降低大量训练的耗时.为了实现这一目标,论文用线性缩放层代替了训练时的BN层,保持了优化方向的多样性和特征表达能力.从 ...
- KingbaseESV8R6 heap table末端垃圾页回收机制
前言 默认情况下,vacuum表不能释放磁盘空间,只是在dead tuple做个标记位,但heap table末端的垃圾页可以被truncate,从磁盘中释放空间.例如表的末尾的100个数据块里面全是 ...