引 言 视觉任务处理的图片常用类型有RGB图、grayscale灰度图、binary二值图、PNG图等图像形式。图像打开和格式转换需要使用PIL
库。本文主要讲解PIL
库图像格式转换以及如何提取RGB每个通道的图片。
文章目录
- 一、图像格式转换
- 1.1 RGB格式图像
- 1.2 grayscale灰度图
- 1.3 二值图像
- 1.4 PNG格式图像
- 1.5 RGBA图像
- 1.6 YCbCr图像
- 二、RGB各通道图像提取
- 三、区分numpy.array和torch.tensor存储图像维度变化
一、图像格式转换
图像打开并转换成项目需要的格式调用函数为:Image.open(img_path).convert(format_str)
format_str
参数:**‘RGB’,‘L’, ‘1’,‘P’,‘RGBA’, ‘YCbCr’**等。
1.1 RGB格式图像
传统的红绿蓝三色图,每个通道的每个像素用8bit像素值表示0~255,语法为image.convert('RGB')
。
img_path = r'F:\pytorch_project\plane.jpg'
image = Image.open(img_path).convert('RGB')
img = np.array(image)
plt.imshow(image)
plt.show()
1.2 grayscale灰度图
图像中每个像素值为8bit,黑:0,白:255,其他像素值表示不同的灰度等级。
从RGB图转换成灰度图,实现公式【gray = 0.299R+0.587G+0.114*B】,语法为:
image = Image.open(img_path).convert('L')
此外,img.convert('I')
表示32位整型灰度图,img.convert('F')
表示32为浮点型灰度图。
1.3 二值图像
图像中只有两种像素值,黑:0,白:255,语法为:
image = Image.open(img_path).convert('1')
1.4 PNG格式图像
该格式图像为8bit图像,每个像素值通过查阅调色板获取,语法为:
image = Image.open(img_path).convert('P')
1.5 RGBA图像
图像为32bit,前24bit存储RGB三通道像素值,最后8bit存储透明度信息,语法为:
image = Image.open(img_path).convert('RGBA')
1.6 YCbCr图像
YCbCr图为24bit彩色图,Y表示亮度通道,Cb和Cr表示两个色度通道,肉眼对亮度通道敏感,对两个色度通道进行下采样。语法为:
image = Image.open(img_path).convert('YCbCr')
二、RGB各通道图像提取
对于RGB各图层图像的提取并展示有利于更直观了解图像的情况。
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
img_path = r'F:\pytorch_project\plane.jpg'
# 获取图像数据
image = Image.open(img_path).convert('RGB')
img = np.array(image)
img_list = []
# 获取各图层数据
for i in range(img.shape[-1]):
temp = np.zeros_like(img)
temp[...,i] = img[:,:,i]
img_list.append(temp)
# 图像展示
fig,axes = plt.subplots(1,3)
titles = ['the image of {} channel'.format(channel) for channel in ['R','G','B']]
for i in range(len(img_list)):
axes[i].imshow(img_list[i])
axes[i].set_title(titles[i])
plt.show()
三、区分numpy.array和torch.tensor存储图像维度变化
numpy.array
存储的图像维度为【H,W,C】,torch.tensor
存储的图像通道维度【C,H,W】,在使用过程中要注意对图像矩阵进行维度转换。
import numpy as np
from PIL import Image
from torchvision import transforms
img_path = r'F:\pytorch_project\plane.jpg'
image = Image.open(img_path).convert('RGB')
img_np = np.array(image)
img_tensor = transforms.ToTensor()(image)
print("numpy.array shape: {}".format(img_np.shape))
print("torch.tensor shape: {}".format(img_tensor.shape))
###
numpy.array shape: (1200, 1920, 3)
torch.tensor shape: torch.Size([3, 1200, 1920])