Pytorch图像处理,显示与保存

王 茂南 2019年9月1日07:00:32
评论
1 3538字阅读11分47秒
摘要这一篇主要介绍关于Pytorch中进行图像处理的一些操作, 包括图像的处理(大小裁剪, 归一化, 转换为tensor), 接着介绍pytorch中的make_grid和save_image的使用.

简介

这一篇文章我们主要会介绍在使用Pytorch的时候, 我们的数据集是图像的时候的一些操作. 之前也是零散的写过一些pytorch中图像的处理, 如Pytorch中图片数据集处理方式,我们在这里集中的描述一下.

这里主要会介绍以下的内容:

  • 图像的标准化, 为什么要使用0.5来作为标准化的值.
  • 使用ImageFolder来完成图片数据集的导入.
  • 使用make_grid来完成图像的显示.
  • 使用save_image来完成图像的保存.

同时, 会增加一部分, 直接使用cv2来对整个文件夹内的图片进行处理, 并生成新的图片. 关于opencv的更多内容, 可以查看文章图像处理-matplotlib显示opencv图像

 

使用cv2处理图像

有的时候, 我们希望直接对原始的图像进行处理, 并将处理好的图像保存下来, 这个时候就可以直接使用cv2进行处理. 下面看一个例子, 实现关于:

  • 调整原始图片的大小
  • 将原始图片转换为灰度图
  1. # 将图片重新存储
  2. # - 调整大小
  3. # - 调整为灰色
  4. def image_preprocess(dir_path='./dogs_cats_gray/cat/'):
  5.     """图片预处理
  6.     """
  7.     i = 0
  8.     for img in tqdm(os.listdir(dir_path)): # 调用 tqdm 可视化循环处理过程
  9.         img_path = os.path.join(dir_path, img) # 图像的完整路径
  10.         img_data = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 使用 opencv读取图像
  11.         img_data = cv2.resize(img_data, (64, 64)) # 图片处理成统一大小
  12.         os.remove(img_path) # 删除原始图像
  13.         cv2.imwrite(img_path, img_data)# 保存新的图像
  14.         i = i + 1
  15.         if i%5000 == 0:
  16.             print('i:',i,'img_name:',img,image_label(img))

关于使用cv2来进行图像的显示, 可以使用imshow来进行显示.

  1. import cv2
  2. # 查看两张图片
  3. img_path1 = "./dogs_cats/cat/cat.7.jpg"
  4. img_check1 = cv2.imread(img_path1, cv2.IMREAD_GRAYSCALE)
  5. img_path2 = "./dogs_cats/dog/dog.8.jpg"
  6. img_check2 = cv2.imread(img_path2, cv2.IMREAD_GRAYSCALE)
  7. # 显示图片
  8. fig, axes = plt.subplots(nrows=1, ncols=2,figsize=(13,7))
  9. axes[0].imshow(img_check1,'gray')
  10. axes[1].imshow(img_check2,'gray')

 

Pytorch图像处理

图像的标准化

我们通常会使用如下的方式对图像进行处理, 我们会控制图像的大小, 转换为tensor, 同时进行标准化.

  1. trans = transforms.Compose([
  2.     transforms.Resize(64),
  3.     transforms.ToTensor(),
  4.     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
  5. ])

下面简单说明以下为什么标准化里的参数都是0.5, 这可以保证标准化之后的图像的像素值在-1到1之间. 这是因为: For example, the minimum value 0 will be converted to (0-0.5)/0.5=-1, the maximum value of 1 will be converted to (1-0.5)/0.5=1.

我们可以使用下面的方式将像素值进行还原: image = ((image * std) + mean)

参考资料: Understanding transform.Normalize( )

图像的导入

接着就是图像进行导入, 在pytorch中图像的导入也是十分方便的, 我们可以使用如下的方式进行图像的导入.

  1. # 注意这里文件夹的路径
  2. dataset = datasets.ImageFolder('./data', transform=trans) # 数据路径
  3. dataloader = torch.utils.data.DataLoader(dataset,
  4.                                      batch_size=16, # 批量大小
  5.                                      shuffle=True# 乱序
  6.                                      num_workers=2 # 多进程
  7.                                      )

我们需要注意文件夹的路径的设置.

  1. root/dog/xxx.png
  2. root/dog/xxy.png
  3. root/dog/xxz.png
  4. root/cat/123.png
  5. root/cat/nsdf3.png
  6. root/cat/asd932_.png

就是他只需要写到root目录, 然后把每一类图片分别放在对应的文件夹内. 我们不能直接将图片放在root目录下, 不然就会出现如下的报错: RuntimeError: Found 0 images in subfolders of: ./data

上面报错解决链接: RuntimeError: Found 0 images in subfolders of: ./data

使用make_grid显示图像

接着我们说明以下make_grid的使用方式, 他可以方便的进行图片的显示, 下面简单说一下使用的方式, 具体的使用方式可以参考官方的文档: TORCHVISION.UTILS

make_grid可以使得图像按照网格进行排列, 我们下面来看一个例子. 也讲一下其中的参数的作用.

  1. from torchvision.utils import make_grid
  2. from torchvision.utils import save_image

定义show函数, 用来显示图片. 图像的大小可以在这里进行修改(figsize).

  1. def show(img):
  2.     """
  3.     用来显示图片的
  4.     """
  5.     plt.figure(figsize=(12, 8))
  6.     npimg = img.numpy()
  7.     plt.imshow(np.transpose(npimg, (1,2,0)), interpolation='nearest')

接着我们先随便看一个例子

  1. show(make_grid(test_pic, nrow=6, padding=2, normalize=Truerange=None, scale_each=False, pad_value=0))
Pytorch图像处理,显示与保存

我们可以通过修改nrow来修改每一行的图片的数量, 同时padding表示图片之间的间距, pad_value表示图片之间填充的颜色. 我们可以分别来看下面的两个例子.

  1. show(make_grid(test_pic, nrow=8, padding=1, normalize=Truerange=(-1, 1), scale_each=False, pad_value=0.5))
Pytorch图像处理,显示与保存

下面的padding就比较大, 可以很明显的看出区别来.

  1. # padding: 图片与图片之间的空隙
  2. # pad_value: 填充的颜色
  3. show(make_grid(test_pic, nrow=8, padding=100, normalize=Truerange=(-1, 1), scale_each=False, pad_value=0.9))
Pytorch图像处理,显示与保存

使用save_image保存图像

关于save_image的主要参数和上面的make_grid是一样的, 这里就不多做介绍, 就直接看一下例子.

  1. save_image(test_pic, 'test.png', nrow=6, padding=2, normalize=Truerange=(-1,1), scale_each=False, pad_value=0)

最终保存的图片如下所示.

Pytorch图像处理,显示与保存

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2019年9月1日07:00:32
  • 转载请务必保留本文链接:https://mathpretty.com/11050.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: