'''
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在图片上画各种形状的线的更多相关文章

  1. Linux_window与linux之间文件互传,上传下载

    window与linux之间文件互传 运行环境:Centos os7 + win8.1 +putty putty:是一个Telnet,ssh,rlogin,纯tcp以及串行接口连接软件,由于linux ...

  2. 【openssl】利用openssl完成X509证书和PFX证书之间的互转

    利用openssl完成X509证书和PFX证书之间的互转 # OpenSSL的下载与安装: 1.下载地址: 官方网址—— https://www.openssl.org/source/ OpenSSL ...

  3. JavaScript三种数据类型之间的互转

    一:number<===>string  数字类型和字符串类型之间的互相转换 number===>string 数字转字符串有三种方式: 1.在数字后面 +“ ”; 2.利用字符串的 ...

  4. fastjson对象,JSON,字符串,map之间的互转

    1.对象与字符串之间的互转 将对象转换成为字符串 String str = JSON.toJSONString(infoDo); 字符串转换成为对象 InfoDo infoDo = JSON.pars ...

  5. list<Integer>,Integer[],int[]之间的互转(jdk1.8)

    偶然在开发过程中需要将int[] 转成 List<Integer>,采用了遍历的方式,写的代码实在太多. List<Integer> list = new ArrayList& ...

  6. 机器学习进阶-背景建模-(帧差法与混合高斯模型) 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 ...

  7. 机器学习进阶-案例实战-答题卡识别判 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 ...

  8. 机器学习进阶-项目实战-信用卡数字识别 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表示需要填写的 ...

  9. 图片旋转 1. cv2.getRotationMatrix2D(获得仿射变化矩阵) 2. cv2.warpAffine(进行仿射变化)

    原文:https://www.cnblogs.com/my-love-is-python/p/10959612.html 1.rot_mat =  cv2.getRotationMatrix2D(ce ...

  10. 机器学习进阶-目标跟踪-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 ...

随机推荐

  1. electron fiddle 下载 镜像 下载不下来 已解决 electron-api-demos 安装

    fiddle 官网 https://www.electronjs.org/fiddle 一共3步 1. npm config set registry https://registry.npm.tao ...

  2. python数组基本用法实例解析

    一 数组的内容的查找 array的查找是依靠index,超出内容的会报错误 import array int_array = array.array('i', [0, 1, 2, 3, 1, 2]) ...

  3. python元组(tuple)循环遍历实例分析

    一 概念: 元组是有序且不可更改的集合.在 Python 中,元组是用圆括号编写的. 二 使用方法: 1  基本创建: thistuple = ("apple", "ba ...

  4. c语言中float和double类型的区别

    1.变量bai类型不同 float属于单du精度zhi型浮点数据. double属于双精度型浮点数据. 2.指数范围不同 float的指数范围为-127~128. double而double的指数范围 ...

  5. KETTLE4个工作中有用的复杂实例--2、两表数据比较,循环取数据,比较后自动同步(部门、单位数据同步)

    附:Kettle实战视频教程,需要的朋友可以看看学习下哈~~ kettle实战第一讲-文件和数据库表的互相转换处理_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili kettle实战第二讲-数据库单 ...

  6. TTS 擂台: 文本转语音模型的自由搏击场

    对文本转语音 (text-to-speech, TTS) 模型的质量进行自动度量非常困难.虽然评估声音的自然度和语调变化对人类来说是一项微不足道的任务,但对人工智能来说要困难得多.为了推进这一领域的发 ...

  7. Java浮点数内存存储

    转自: [解惑]剖析float型的内存存储和精度丢失问题 1.小数的二进制表示问题 首先我们要搞清楚下面两个问题: (1)  十进制整数如何转化为二进制数 算法很简单.举个例子,11表示成二进制数: ...

  8. 【Atcoder D - Circumferences】并查集

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

  9. RecyclerView瀑布流优化方案探讨

    目录介绍 01.规则瀑布流实现 02.不规则瀑布流实现 2.1 实现方式 2.2 遇到问题 03.瀑布流上拉加载 04.给瀑布流设置分割线 05.自定义Manager崩溃 06.如何避免刷新抖动 07 ...

  10. Linux快速入门(七)效率工具(Vim)

    Vim编辑器 所有的Linux系统都会内建一个Vi文本编辑器,而Vim是从Vi发展出来的一个高度可配置的文本编辑器,旨在高效的创建和更改任何类型的文本,它还可以根据文件的扩展名判别编程语言. 使用方式 ...