• 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()
    
  • 相关阅读:
    JS中的事件&对象
    WSL使用小结:从ArchLinux到Manjaro
    WSL学习:安装ArchLinux和Root/Cling以及注意事项
    Qt5网络请求使用及WebRequest函数
    有道词典中的OCR功能:第三方库的变化
    C++学习(二):学会使用stringstream
    C语言集锦(三)Direct3D和GDI+的例子
    网络那些事:浏览器、网络协议以及常见软件
    C++学习(一):现代C++尝试
    PostScript学习:另一种缩写为PS的技术
  • 原文地址:https://www.cnblogs.com/52dxer/p/15508265.html
Copyright © 2020-2023  润新知