概述

PyTorch在做一般的深度学习图像处理任务时,先使用dataset类和dataloader类读入图片,在读入的时候需要做transform变换,其中transform一般都需要ToTensor()操作,将dataset类中__getitem__()方法内读入的PIL或CV的图像数据转换为torch.FloatTensor。详细过程如下:

PIL与CV数据格式

  1. PIL(RGB)

    PIL(Python Imaging Library)是Python中最基础的图像处理库,一般操作如下:
  1. from PIL import Image
  2. import numpy as np
  3. image = Image.open('test.jpg') # 图片是400x300 宽x高
  4. print type(image) # out: PIL.JpegImagePlugin.JpegImageFile
  5. print image.size # out: (400,300)
  6. print image.mode # out: 'RGB'
  7. print image.getpixel((0,0)) # out: (143, 198, 201)
  8. # resize w*h
  9. image = image.resize((200,100),Image.NEAREST)
  10. print image.size # out: (200,100)
  11. '''
  12. 代码解释
  13. **注意image是 class:`~PIL.Image.Image` object**,它有很多属性,比如它的size是(w,h),通道是RGB,,他也有很多方法,比如获取getpixel((x,y))某个位置的像素,得到三个通道的值,x最大可取w-1,y最大可取h-1
  14. 比如resize方法,可以实现图片的放缩,具体参数如下
  15. resize(self, size, resample=0) method of PIL.Image.Image instance
  16. Returns a resized copy of this image.
  17. :param size: The requested size in pixels, as a 2-tuple:
  18. (width, height).
  19. 注意size是 (w,h),和原本的(w,h)保持一致
  20. :param resample: An optional resampling filter. This can be
  21. one of :py:attr:`PIL.Image.NEAREST`, :py:attr:`PIL.Image.BOX`,
  22. :py:attr:`PIL.Image.BILINEAR`, :py:attr:`PIL.Image.HAMMING`,
  23. :py:attr:`PIL.Image.BICUBIC` or :py:attr:`PIL.Image.LANCZOS`.
  24. If omitted, or if the image has mode "1" or "P", it is
  25. set :py:attr:`PIL.Image.NEAREST`.
  26. See: :ref:`concept-filters`.
  27. 注意这几种插值方法,默认NEAREST最近邻(分割常用),分类常用BILINEAR双线性,BICUBIC立方
  28. :returns: An :py:class:`~PIL.Image.Image` object.
  29. '''
  30. image = np.array(image,dtype=np.float32) # image = np.array(image)默认是uint8
  31. print image.shape # out: (100, 200, 3)
  32. # 神奇的事情发生了,w和h换了,变成(h,w,c)了
  33. # 注意ndarray中是 行row x 列col x 维度dim 所以行数是高,列数是宽
  1. OpenCV(python版)(BGR)

    OpenCV是一个很强大的图像处理库,适用面更广,可以在各种场合看到,性能也较好,相关代码也较多。常用操作如下:
  1. import cv2
  2. import numpy as np
  3. image = cv2.imread('test.jpg')
  4. print type(image) # out: numpy.ndarray
  5. print image.dtype # out: dtype('uint8')
  6. print image.shape # out: (300, 400, 3) (h,w,c) 和skimage类似
  7. print image # BGR
  8. '''
  9. array([
  10. [ [143, 198, 201 (dim=3)],[143, 198, 201],... (w=200)],
  11. [ [143, 198, 201],[143, 198, 201],... ],
  12. ...(h=100)
  13. ], dtype=uint8)
  14. '''
  15. # w*h
  16. image = cv2.resize(image,(100,200),interpolation=cv2.INTER_LINEAR)
  17. print image.dtype # out: dtype('uint8')
  18. print image.shape # out: (200, 100, 3)
  19. '''
  20. 注意注意注意 和skimage不同
  21. resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
  22. 关键字参数为dst,fx,fy,interpolation
  23. dst为缩放后的图像
  24. dsize为(w,h),但是image是(h,w,c)
  25. fx,fy为图像x,y方向的缩放比例,
  26. interplolation为缩放时的插值方式,有三种插值方式:
  27. cv2.INTER_AREA:使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN方法    
  28. cv2.INTER_CUBIC: 立方插值
  29. cv2.INTER_LINEAR: 双线形插值 
  30. cv2.INTER_NN: 最近邻插值
  31. [详细可查看该博客](http://www.tuicool.com/articles/rq6fIn)
  32. '''
  33. '''
  34. cv2.imread(filename, flags=None):
  35. flag:
  36. cv2.IMREAD_COLOR 1: Loads a color image. Any transparency of image will be neglected. It is the default flag. 正常的3通道图
  37. cv2.IMREAD_GRAYSCALE 0: Loads image in grayscale mode 单通道灰度图
  38. cv2.IMREAD_UNCHANGED -1: Loads image as such including alpha channel 4通道图
  39. 注意: 默认应该是cv2.IMREAD_COLOR,如果你cv2.imread('gray.png'),虽然图片是灰度图,但是读入后会是3个通道值一样的3通道图片
  40. '''

另外,PIL图像在转换为numpy.ndarray后,格式为(h,w,c),像素顺序为RGB;

OpenCV在cv2.imread()后数据类型为numpy.ndarray,格式为(h,w,c),像素顺序为BGR。

torchvision.transforms.ToTensor()

torchvision.transforms.transforms.py:61

  1. class ToTensor(object):
  2. """Convert a ``PIL Image`` or ``numpy.ndarray`` to tensor.
  3. Converts a PIL Image or numpy.ndarray (H x W x C) in the range
  4. [0, 255] to a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0].
  5. """
  6. def __call__(self, pic):
  7. """
  8. Args:
  9. pic (PIL Image or numpy.ndarray): Image to be converted to tensor.
  10. Returns:
  11. Tensor: Converted image.
  12. """
  13. return F.to_tensor(pic)
  14. def __repr__(self):
  15. return self.__class__.__name__ + '()'

torchvision.transforms.functional.py:32

  1. def to_tensor(pic):
  2. """Convert a ``PIL Image`` or ``numpy.ndarray`` to tensor.
  3. See ``ToTensor`` for more details.
  4. Args:
  5. pic (PIL Image or numpy.ndarray): Image to be converted to tensor.
  6. Returns:
  7. Tensor: Converted image.
  8. """
  9. if not(_is_pil_image(pic) or _is_numpy_image(pic)):
  10. raise TypeError('pic should be PIL Image or ndarray. Got {}'.format(type(pic)))
  11. if isinstance(pic, np.ndarray):
  12. # handle numpy array
  13. img = torch.from_numpy(pic.transpose((2, 0, 1)))
  14. # backward compatibility
  15. if isinstance(img, torch.ByteTensor):
  16. return img.float().div(255)
  17. else:
  18. return img
  19. if accimage is not None and isinstance(pic, accimage.Image):
  20. nppic = np.zeros([pic.channels, pic.height, pic.width], dtype=np.float32)
  21. pic.copyto(nppic)
  22. return torch.from_numpy(nppic)
  23. # handle PIL Image
  24. if pic.mode == 'I':
  25. img = torch.from_numpy(np.array(pic, np.int32, copy=False))
  26. elif pic.mode == 'I;16':
  27. img = torch.from_numpy(np.array(pic, np.int16, copy=False))
  28. elif pic.mode == 'F':
  29. img = torch.from_numpy(np.array(pic, np.float32, copy=False))
  30. elif pic.mode == '1':
  31. img = 255 * torch.from_numpy(np.array(pic, np.uint8, copy=False))
  32. else:
  33. img = torch.ByteTensor(torch.ByteStorage.from_buffer(pic.tobytes()))
  34. # PIL image mode: L, P, I, F, RGB, YCbCr, RGBA, CMYK
  35. if pic.mode == 'YCbCr':
  36. nchannel = 3
  37. elif pic.mode == 'I;16':
  38. nchannel = 1
  39. else:
  40. nchannel = len(pic.mode)
  41. img = img.view(pic.size[1], pic.size[0], nchannel)
  42. # put it from HWC to CHW format
  43. # yikes, this transpose takes 80% of the loading time/CPU
  44. img = img.transpose(0, 1).transpose(0, 2).contiguous()
  45. if isinstance(img, torch.ByteTensor):
  46. return img.float().div(255)
  47. else:
  48. return img

可以从to_tensor()函数看到,函数接受PIL Image或numpy.ndarray,将其先由HWC转置为CHW格式,再转为float后每个像素除以255.

PyTorch载入图片后ToTensor解读(含PIL和OpenCV读取图片对比)的更多相关文章

  1. 使用Python的PIL模块来进行图片对比

    使用Python的PIL模块来进行图片对比 在使用google或者baidu搜图的时候会发现有一个图片颜色选项,感觉非常有意思,有人可能会想这肯定是人为的去划分的,呵呵,有这种可能,但是估计人会累死, ...

  2. 【转载】 opencv, PIL.Image的彩色图片维度 && caffe和pytorch的矩阵维度

    原文地址: https://blog.csdn.net/u011668104/article/details/82718375 ------------------------------------ ...

  3. Python中Opencv和PIL.Image读取图片的差异对比

    近日,在进行深度学习进行推理的时候,发现不管怎么样都得不出正确的结果,再仔细和正确的代码进行对比了后发现原来是Python中不同的库读取的图片数组是有差异的. image = np.array(Ima ...

  4. 【小白学PyTorch】16 TF2读取图片的方法

    [新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.NLP等多个学术交流分群和水群唠嗑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx645016617. 参考 ...

  5. 【CSS学习笔记】初始化CSS后,写li,并利用背景图片,来完成li小图标的效果,且达到个浏览器兼容

    第一种情况 /*当标题前的图标时单独的一个点儿或者方块或者其他类似图标时,定义背景图background要放在<li>里.    在<li>中设置背景图片的尺寸,地址,不重复, ...

  6. python科学计算库numpy和绘图库PIL的结合,素描图片(原创)

    # 导入绘图库 from PIL import Image #导入科学计算库 import numpy as np #封装一个图像处理工具类 class TestNumpy(object): def ...

  7. ajax读取图片后排列问题(先加载完图片再排列)

    网上找了个瀑布流的图片排列插件.从数据库读取图片路径后显示时出现了位置重叠问题. $.ajax({ type: "POST", url: "index.aspx" ...

  8. opencv图像处理时使用stringstream批量读取图片,处理后并保存

    简介: 同文件输入输出流一样,使用stringstream可以批量读取图片,处理后并进行保存.因为C++中头文件 stringstream既可以从string读数据也可向string写数据,利于其这个 ...

  9. python 利用PIL库进行更改图片大小的操作

    python 是可以利用PIL库进行更改图片大小的操作的,当然一般情况下是不需要的,但是在一些特殊的利用场合,是需要改变图片的灰度或是大小等的操作的,其实用python更改图片的大小还是蛮简单的,只需 ...

随机推荐

  1. 迭代器 Iterator 是什么?(未完成)Iterator 怎么使用?(未完成)有什么特点?(未完成)

    迭代器 Iterator 是什么?(未完成)Iterator 怎么使用?(未完成)有什么特点?(未完成)

  2. duilib学习领悟(2)

    再次强调,duilib只不过是一种思想! 在上一节中,我剖析了duilib中窗口类的注册,其中遗留两个小问题没有细说的? 第一个问题:过程函数中__WndProc()中有这么一小段代码: pThis ...

  3. maven 安装第三方jar到本地 出现 The goal you specified requires a project to execute but there is no POM in this directory 错误

    原因是因为操作系统的差异导致,把所有参数加上引号即可. 如下所示: mvn install:install-file "-Dfile=cobra.jar" "-Dgrou ...

  4. 调整swt table的行高

    table.addListener(SWT.MeasureItem, new Listener() { public void handleEvent(Event event) { // 设置行高度 ...

  5. Pandas to_sql TypeError: sequence item 0: expected str instance, dict found

    问题介绍 打印了一下数据格式,并未发现问题.如果说是字典实例引起的. 我猜测也是extra字段引起的,因为extra字段是一个json字段.根据网上的提示要对这样的格式进行强转str. 其他发现:pd ...

  6. [Google Guava] 2.4-集合扩展工具类

    原文链接 译文链接 译者:沈义扬,校对:丁一 简介 有时候你需要实现自己的集合扩展.也许你想要在元素被添加到列表时增加特定的行为,或者你想实现一个Iterable,其底层实际上是遍历数据库查询的结果集 ...

  7. Appium自动化测试教程-自学网-Package与Activity

    Package Package 包.只是在我们的app中这个Package是唯一的,就像你身份证号码一样.在我们做app自动化时,我们就需要知道他的Package,我们知道了Package那么也就知道 ...

  8. 变形课 HDU - 1181 【floyd传递闭包水题】

    呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个 ...

  9. 五十九.大数据、Hadoop 、 Hadoop安装与配置 、 HDFS

    1.安装Hadoop 单机模式安装Hadoop 安装JAVA环境 设置环境变量,启动运行   1.1 环境准备   1)配置主机名为nn01,ip为192.168.1.21,配置yum源(系统源) 备 ...

  10. Java+自动扫描文件夹+发送+上传

    1.介绍enctype enctype 属性规定发送到服务器之前应该如何对表单数据进行编码. enctype作用是告知服务器请求正文的MIME类型(请求消息头content-type的作用一样) 1. ...