(二)深度学习数据处理-----图片数据处理

如果你对数据处理不熟悉,可以看我的上篇博客,里面介绍了常用的数据处理方法

上篇博客地址:机器学习数据处理

目录

1、pytorch加载数据集

1、加载pytorch自带的数据集

2、图像读取和保存

         1、PIL读取和保存图片:

2、cv2读取和保存图片: 

3、matplotlib读取和保存图片:

4、torchvision.transforms图片处理

0、class torchvision.transforms.Compose (transforms)

1、class torchvision.transforms.CenterCrop(size)

2、class torchvision.transforms.FiveCrop(size)

3、class torchvision.transforms.Grayscale(num_output_channels=1)

4、class torchvision.transforms.Pad(padding, fill=0, padding_mode=‘constant’)

5、class torchvision.transforms.RandomAffine(degrees, translate=None, scale=None)

6、class torchvision.transforms.Resize(size,interpolation=2)

7. class torchvision.transforms.ToPILImage(mode=None)

下面两个在pytorch上操作

8、class torchvision.transforms.ToTensor

9.class torchvision.transforms.Normalize(mean,std)


1、pytorch加载数据集

       torch.utils.data.Dataset

1、加载pytorch自带的数据集

使用torchvision.datasets.‘数据集’ 可以加载下面几个个数据集

  • MNIST:一个手写数字数据集集,提供了60000+训练用例和10000个测试用例
  • COCO:通常认为COCO是更倾向于图像分割的数据集
  • Captions:望文生义,主要是标题测试用例,通常算在COCO中
  • Detection:感知数据集,通常也包含在COCO中
  • LSUN:场景感知数据集(感觉很酷
  • CIFAR10或CIFAR100:一个常用的微型图像数据子集
  • STL10:一个用于开发无监督特征学习、深度学习、自学学习算法的图像识别数据集。
  • SVHN:一个真实世界的图像数据集,用于开发机器学习和对象识别算法,对数据预处理和格式要求很低。
  • PhotoTour:旅游照片数据集

2、图像读取和保存

            处理图像的方式有三种方式,分别使用PIL, matplotlib, CV2库

1、PIL读取和保存图片:

读取通道顺序:RGB 

数据类型:PIL,

转成numpy后的像素类型和大小:uint8, 0~255

from PIL import Image
import numpy as np
img_path = './data/1.jpg'  #图片路径

#PIL读取图片
PIL_img = Image.open(img_path) #读取图片,图片是PIL数据类型

#PIL保存图片
PIL_img.save('./data/2.jpg')  #

#将PIL类型转成numpy类型, numpy数组格式(H,W,C=3)
np_img = np.asanyarray(PIL_img)  #将PIL类型转成numpy类型,数据类型是uint8, (H, W, C)


#用PIL显示
PIL_img.show()

#用matplotlib.pyplot显示
plt.imshow(np_img)   #读取通道是RGB, 不用转换

2、cv2读取和保存图片: 

读取通道顺序:BRG,

数据类型:ndarray

像素类型:uint8,  0~255

import cv2
import numpy as np


#cv2读取图片,读取后的类型是numpy类型的数组, 读取的通道顺序是BRG
cv2_img = cv2.imread('./data/1.jpg') #numpy数组,元素类型是uinit8 0~255

#保存图片,第二个是numpy数组或mat数组,类型是jpg或png
cv2.imwrite('D:/data/1.jpg', cv2_img) #


#CV2显示图片,只能用来显示通道顺序为BRG的numpy数组,不然产生色差
cv2.imshow('labels',cv2_img)
cv2.waitKey(0)

#matplotlib.pyplot显示
plt.imshow(cv2_img[:,:,::-1]) #读取通道是BGR,所以[:,:,::-1]将其转换成RGB格式

3、matplotlib读取和保存图片:

读取通道顺序:RGB

数据类型:ndarray

数据类型:uint8, 0~255 

注:这个uint8类型好像有争议,有的人说是0~1之间,我猜测是可能是因为版本太旧才会显示float。我电脑上上显示的是uint8

import matplotlib.pyplot as plt

#读取图片,读取通道的顺序是RGB
plt_img = plt.imread('./data/1.jpg')  #uint8

#保存图片
plt.imsave('D:/data/3.png', plt_img) #类型可以是jpg或png

#显示图片
plt.imshow(plt_img)

4、torchvision.transforms图片处理

这个模块只能处理PIL类型的数据,所以图片要么用PIL.Image读取,要么将ndarray图片数据转成PIL类型,

PIL和numpy相互转换方式如下:

from PIL import Image

#PIL image转成numpy
np_img = np.asarray(PIL_img)  #参数时PIL类型的图片
或 
np_img = np.array(PIL_img)

#将array准成PIL image
Image.fromarray(np.uint8(np_img))

下面处理的都是PIL图片

0、class torchvision.transforms.Compose (transforms)

       功能:将多个transforms进行组合

transforms.Compose([
			transforms.CenterCrop(10),
			transforms.ToTensor(), 
			])

1、class torchvision.transforms.CenterCrop(size)

     功能:图片剪切,返回图片中心区域位置

     参数:size(整数或tuple), 如果是整数,将自动剪切成正方形区域(size, size)

     返回值:PIL图片

#取图片的中心区域,大小是(28, 28)
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')
cc_img = transforms.CenterCrop((128, 128))(PIL_img)

2、class torchvision.transforms.FiveCrop(size)

      功能:将给定的PIL图像剪裁成四个角落区域和中心区域,这个变换返回的是一个图像元组(tuple of images),  也就是5张PIL图片。

     参数:size(整数或tuple), 如果是整数,将自动裁剪成正方形区域(size, size)

     返回值:返回一个PIL元祖,里面包含五张PIL图片

#生成5张,大小是(128,128)的PIL图片
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')

fc_img = transforms.FiveCrop((128, 128))(PIL_img)

3、class torchvision.transforms.Grayscale(num_output_channels=1)

     功能:将图片转成灰度图片, r=g=b

     参数:  num_output_channels, 只能取1或3,代表输出通道的数量

     返回值:PIL图片

#生成灰度图片, R=G=B
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')

gc_img = transforms.Grayscale(1)(PIL_img)

4、class torchvision.transforms.Pad(padding, fill=0, padding_mode=‘constant’)

功能:对PIL图像的边缘进行填充,填充的像素数值为fill值

参数1:填充长度padding(整数或者tuple)——总共四个边界。如果padding是整数,那么会拉伸所有边界padding个长度。如果是tuple且长度为2,那么俩个数值分别被用于拉伸left/right(宽度) 和 top/bottom(高度)。如果tuple长度是4,那么分别被用来拉伸left, top ,right 和 bottom边界。例如,尺寸为宽度120, 高度130的图片,即120 x 160的图片。如果padding是10, 那么图片将变成尺寸为130 x 170。多出的像素点全部用fill值填充。fill默认是0

参数2:fill(整数或tuple), 填充的像素值。如果是整数, 那个填充区域的R,G,B的值为fill。如果是tuple,那么R,G,B = tuple.

            tuple必须包含3个元素,对应R,G,B的值。

参数3:padding_mode (string) —— 填充的类型,必须为:constant, edge, reflect or symmetric,默认为 constant.

            constant: 以常量值进行填充,常量值由 fill 确定。

             edge: 用图片边界最后一个值进行填充

返回值:PIL图片

#将图片的宽度拉长10*2个像素, 高度拉长15*2个像素,用20, 110, 102分别填充R,G, B通道的值 
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')

pd_img = transforms.Pad((10, 15), (20, 110, 102))(PIL_img)

5、class torchvision.transforms.RandomAffine(degrees, translate=None, scale=None)

     功能:保持中心位置不变,对图片进行仿射变换

     参数1:degree (旋转,tuple或者float或者int) —— 旋转的角度范围。如果角度是数值而不是类似于(min,max)的序列,

                那 么将会转换成(-degree, +degree)序列。设为0则取消旋转。

     参数2:transalate (平移,tuple,可选) —— 数组,其中元素为代表水平和垂直变换的最大绝对分数。

      参数3:scale (缩放,tuple, 可选) —— 缩放因子区间。若scale=(a,b), 则缩放的值在a<=scale<=b 随机采样。默认情况下                      没有缩放。

      参数4:shear (错切,tuple或者 float 或者 int, 可选) —— 错切的程度。如果错切的程度是一个值,那么将会转换为                       序列即(—degree, +degree)。默认情况下不使用错切。

        返回值:PIL图片

#图片顺时针旋转90度,随机进行平移, -0.5<水平平移动距离dx<0.5, -0.3<垂直移动距离dy<0.3, 负代表
#向左移,和向下移
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')

ra_img = transforms.RandomAffine((90, 90), (0.5, 0.3))(PIL_img)

6、class torchvision.transforms.Resize(size,interpolation=2)

        功能:将PIL图片转换成指定尺寸大小

        参数:size(tuple 或者 int) —— 需要输出的图片的大小。如果size是类似于(h,w)的序列,输出的尺寸将会跟(h,w)一致。如果size是整型,图片较小的边界将会被置为这个尺寸。例如,如果height->width, 图片将会被置为 (size*height/width, size)

        返回值:PIL图片

#图片尺寸被调整为120x203
from torchvision import transforms
from PIL import Image
PIL_img = Image.open('./data/1.jpg')

rs_img = transforms.Resize((120, 203))(PIL_img)

7. class torchvision.transforms.ToPILImage(mode=None)

功能:将shape为(C,H,W)的Tensor或shape为(H,W,C)的numpy.ndarray转换成PIL.Image,值不变。

返回值:PIL图片

from torchvision import transforms

#将numpy数组转成PIL图片

PIL_img = transforms.ToPILImage()(np_img)

#将tensor张量转成PIL图片
PIL_img = transforms.ToPILImage()(tensor_img)

下面两个在pytorch上操作

注意:只能作用在tensor上,不能是numpy和PIL类型数据

8、class torchvision.transforms.ToTensor

功能:把一个取值范围是[0,255]的PIL或者shape为(H,W,C)的numpy.ndarray,转换成形状为[C,H,W],取值范围是[0,1.0]的torch.FloadTensor

返回值:tensor张量

#将PIL图片转成tensor
tensor = transforms.ToTensor()(PIL_img)

9.class torchvision.transforms.Normalize(mean,std)

用均值和标准差对张量图像进行标准化处理。给定n通道的均值(M1, … , Mn) 和标准差(S1, … ,Sn), 这个变化将会归一化根据均值和标准差归一化每个通道值。例如,input[channel] = (input[channel]-mean[channel])/std(channel)

功能:对tensor张量的图片数据进行标准化处理

参数:均值,标准差

返回值:tensor张量

from PIL import Image
import numpy as np
import torch
from torchvision import transforms

#先将图片读取成PIL类型,再转成tensor, 再进行标准化

PIL_img = Image.open('/data/1.jpg')
tensor_img = transforms.ToTensor()(PIL_img)
tm_img = transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))(tensor_img)

你可能感兴趣的:(图片知识和操作,深度学习,pytorch,python)