图像的数组、张量、维度表⽰1.图像的数组表⽰
图像的RGB⾊彩模式:
RGB三个颜⾊通道的变化和叠加得到各种颜⾊,其中各通道取值范围:
R 0~255
G 0~255
B 0~255
⽩⾊ 255 255 255
⿊⾊ 0 0 0
RGB形成的颜⾊包括了⼈类视⼒所能感知的所有颜⾊。
常⽤RGB颜⾊表:
PIL库
PIL: Python Image Library
PIL库是⼀个具有强⼤图像处理能⼒的第三⽅库。
pip install pillow
from PIL import Image
#Image是PIL库中代表⼀个图像的类(对象)
图像是⼀个由像素组成的⼆维矩阵,每个元素是⼀个RGB值(R, G, B)。
from PIL import Image
import numpy as np
im = np.array(Image.open("D:/pycodes/beijing.jpg"))
print(im.shape, im.dtype)
图像是⼀个三维数组,维度分别是⾼度,宽度和像素RGB值。
图像的变换
读⼊图像后,获得像素RGB值,修改后保存为新的⽂件。
from PIL import Image
import numpy as np
a = np.array(Image.open("D:/pycodes/beijing.jpg"))
print(a.shape, a.dtype)
b = [255, 255, 255] - a #补值
im = Image.formarray(b.astype('uint8'))
im.save("D:/pycodes/fcity2.jpg")
from PIL import Image
import numpy as np
a = np.array(Image.open("D:/pycodes/beijing.jpg").convert('L')) #转换为灰度值图⽚(⼆维数组)
b = 255 - a
im = Image.formarray(b.astype('uint8'))
im.save("D:/pycodes/fcity3.jpg")
v2d中NHWC不同参数维度
input,
filter,
strides,
padding,
use_cudnn_on_gpu=True,
data_format='NHWC',
dilations=[1, 1, 1, 1],
name=None
)
data_format 默认值为 “NHWC”,也可以⼿动设置为 “NCHW”。
这个参数规定了 input Tensor 和 output Tensor 的排列⽅式。
data_format 设置为 “NHWC” 时,排列顺序为 [batch, height, width, channels];设置为 “NCHW” 时,排列顺序为 [batch, channels, height, width]。
其中 N 表⽰这批图像有⼏张,H 表⽰图像在竖直⽅向有多少像素,W 表⽰⽔平⽅向像素数,C 表⽰通道数(例如⿊⽩图像的通道数 C = 1,⽽ RGB 彩⾊图像的通道数 C = 3)。
TensorFlow选择 NHWC 格式作为默认格式,因为早期开发都是基于 CPU,使⽤ NHWC ⽐ NCHW 稍快⼀些(不难理解,NHWC 局部性更好,cache 利⽤率⾼)。NCHW 则是 Nvidia cuDNN 默认格式,使⽤ GPU 加速时⽤ NCHW 格式速度会更快(也有个别情况例外)。
3.Tensorflow中图像和张量的相互转换
1、通过函数 read_file 读取本地的图像⽂件
2、利⽤函数 decode_jpeg 解码为张量
# -*- coding: utf-8 -*-
import tensorflow as tf
import matplotlib.pylab as plt
# 读取数据⽂件
image = tf.read_file("C:/kitty.jpg", 'r')
# 将图像⽂件解码为Tensor
image_tensor = tf.image.decode_jpeg(image)
# 图像张量的形状
shape = tf.shape(image_tensor)
session = tf.Session()
print("图像的形状为:")
print(session.run(shape))
# 将tensor转换为ndarray
image_ndarray = image_tensor.eval(session=session)
# 显⽰图⽚
plt.imshow(image_ndarray)
plt.show()
图像的形状为:
[393 500 3]
4.PIL.Image/numpy.ndarray与Tensor的相互转化
pytorch团队提供了⼀个ansforms包,我们可以⽤transforms进⾏以下操作:
1. PIL.Image/numpy.ndarray与Tensor的相互转化;
transforms.ToTensor()
#把像素值范围为[0, 255]的PIL.Image或者numpy.ndarray型数据,shape=(H x W x C)转换
成的像素值范围为[0.0, 1.0]的torch.FloatTensor,shape为(N x C x H x W) 待确认。
2. 归⼀化
transforms.Normalize(mean, std)
此转换类作⽤于torch.*Tensor。给定均值(R, G, B)和标准差(R, G, B),⽤公式channel = (channel - mean) / std进⾏规范化。(是对tensor进⾏归⼀化,所以需要放在transforms.ToTensor()之后)
3. 对PIL.Image进⾏裁剪、缩放等操作。
transforms.Scale(256),
transforms.RandomSizedCrop(224),
transforms.RandomHorizontalFlip()
4. transforms.Compose(transforms)将多个transform组合起来使⽤。其中,transforms: 由transform构成的列表.
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
all_transforms = transforms.Compose([
transforms.Scale(256),
transforms.RandomSizedCrop(224),
transforms.RandomHorizontalFlip(), # 对PIL.Image图⽚进⾏操作
transforms.ToTensor(),
normalize])
#其中,transforms.Compose中的操作是按照顺序执⾏的。
5. PIL.Image/numpy.ndarray与Tensor的相互转换:
PIL.Image/numpy.ndarray转化为Tensor,常常⽤在训练模型阶段的数据读取,⽽Tensor转化为PIL.Image/numpy.ndarray则⽤在验证模型阶段的数据输出。
取值范围为[0, 255]的PIL.Image,转换成形状为[C, H, W],取值范围是[0,
1.0]的torch.FloadTensor;
形状为[H, W, C]的numpy.ndarray,转换成形状为[C, H, W],取值范围是[0,
1.0]的torch.FloadTensor。
⽽transforms.ToPILImage则是将Tensor或numpy.ndarray转化为PIL.Image。如果,我们要将Tensor转化为numpy,只需要使⽤.numpy() 即可。
#-*-coding:utf-8-*-
import torch
from torchvision import transforms
from PIL import Image
import cv2
img_path = "./cat.59.jpg"
transform1 = transforms.Compose([
transforms.CenterCrop((224,224)), # 只能对PIL图⽚进⾏裁剪
transforms.ToTensor(),
]
)
## PIL图⽚与Tensor互转
img_PIL = Image.open(img_path).convert('RGB')
img_PIL.show() # 原始图⽚
img_PIL_Tensor = transform1(img_PIL)
print(type(img_PIL))
print(type(img_PIL_Tensor))
#Tensor转成PIL.Image重新显⽰
new_img_PIL = transforms.ToPILImage()(img_PIL_Tensor).convert('RGB')
new_img_PIL.show() # 处理后的PIL图⽚
## opencv读取的图⽚与Tensor互转
# transforms中,没有对np.ndarray格式图像的操作
img_cv = cv2.imread(img_path)
transform2 = transforms.Compose([
transforms.ToTensor(),
]
)
img_cv_Tensor = transform2(img_cv)
print(type(img_cv))
print(type(img_cv_Tensor))
transform和convert的区别5.图像通道转换——从np.ndarray的[w, h , c]转为Tensor的[c, w, h]
在神经⽹络中,图像被表⽰成[c, h, w]格式或者[n, c, h, w]格式,但如果想要将图像以np.ndarray形式输⼊,因np.ndarray默认将图像表⽰成[h, w, c]个格式,需要对其进⾏转化。
n:样本数量
c:图像通道数
w:图像宽度
h:图像⾼度
np.ndarray表⽰图像:
⽤PIL打开⼀张图像,然后通过array()⽅法将其转为np.ndarray形式,最后打印出它的shape即能得到图像时如何存储在np.ndarray中的
from PIL import Image
imoprt numpy as np
img_path = ('./test.jpg')
img = Image.open(img_path)
img_arr = np.array(img)
print(img_arr.shape)
# 输出的结果是(500, 300, 3)
#从上⾯的试验结果我们可以知道,图像以[h, w, c]的格式存储在np.ndarray中的。
np.ndarray与Tensor中图像格式区别
两者均以三维数组来表⽰⼀张图像,他们的区别在于图像信息被保存在数组中的不同位置,具体来说:
np.ndarray的[h, w, c]格式:数组中第⼀层元素为图像的每⼀⾏像素,第⼆层元素为每⼀列像素,最后⼀层元素为每⼀个通道的像素值,它将图⽚中的每⼀个像素作为描述单元,记录它三个通道的像素值。
Tensor的[c, h, w]格式:数组中第⼀层元素为图像的三个通道,第⼆层元素为某个通道上的⼀⾏像素,第三层为该通道上某列的像素值,它将图像某个通道的某⾏像素值作为描述单元。
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# ⽤随机数模拟⼀张图像
image = np.random.randint(256, size=60)
image = shape((5,4,3))
image_hwc = np.uint8(image)
# 展⽰图像
image_show = Image.fromarray(image_hwc)
plt.imshow(image_show)
plt.show()
# 打印图像像素值,[h, w, c]格式
print(image_hwc)
# 打印像素值,[c, h, w]格式
image_chw = np.transpose(image_hwc, (2,0,1))
print(image_chw)
从[w, h, c]转为[c, w, h]
可以借助numpy的transpose()函数来实现这个转换。
image_chw = np.transpose(image_hwc, (2,0,1))
6.获取张量形状的操作
TensorFlow 获取张量形状的操作
tf.shape(tensor)
tensor.shape
<_shape() :tensor.shape 的别名
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论