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()
原文地址:https://www.cnblogs.com/52dxer/p/15508265.html