image.convert()函数转换格式及显示图像的RGB三通道图像

引 言 视觉任务处理的图片按照图像通道深度分为单通道图像和多通道图像。单通道图像有grayscale灰度图、binary二值图、PNG图,多通道图像有三通道24位真彩色RGB图,8位伪彩色图像,YCbCr图像等。本文先介绍各种格式图像的特点,随后讲解图像的不同加载方法和格式转换语句,图像数据不同存储方式的维度变化,以及如何提取RGB每个通道的图片。

文章目录

    • 一、常见图像格式介绍
      • [1.1 grayscale灰度图](#1.1 grayscale灰度图)
      • [1.2 二值图像](#1.2 二值图像)
      • [1.3 PNG格式图像](#1.3 PNG格式图像)
      • [1.4 RGB格式图像](#1.4 RGB格式图像)
      • [1.5 RGBA图像](#1.5 RGBA图像)
      • [1.6 8位伪彩色图](#1.6 8位伪彩色图)
    • 二、图像加载和格式转换
      • 2.1图像加载方式
        • [2.1.1 调用`Image.open(img_path)`加载图像](#2.1.1 调用Image.open(img_path)加载图像)
        • [2.1.2 调用`cv2.imread(img_path,flags=1)`加载图像](#2.1.2 调用cv2.imread(img_path,flags=1)加载图像)
      • [2.2 图像格式转换](#2.2 图像格式转换)
        • [2.2.1 grayscale灰度图](#2.2.1 grayscale灰度图)
        • [2.2.2 二值图像](#2.2.2 二值图像)
        • [2.2.3 RGB格式图像](#2.2.3 RGB格式图像)
        • [2.2.4 PNG格式图像](#2.2.4 PNG格式图像)
        • [2.2.5 RGBA图像](#2.2.5 RGBA图像)
        • [2.2.6 YCbCr图像](#2.2.6 YCbCr图像)
    • 三、区分numpy.array和torch.tensor存储图像维度变化
    • 四、RGB各通道图像提取

一、常见图像格式介绍

1.1 grayscale灰度图

灰度图为单通道图像,每个像素值为8bit,像素取值范围:0~255,其中0:黑,255:白,其他像素值表示不同的灰度等级。从RGB图转换成灰度图,像素值转换公式【gray = 0.299R+0.587 G+0.114*B】。

示例:模仿灰度图像素值的示例代码及显示效果

c 复制代码
img_gray = np.array([[0,120,230],[255,60,150],[100,60,30]])
print('image pixel values:\n',img_gray)
plt.imshow(img_gray,cmap=plt.cm.gray)
plt.title('Display image pixel values')
plt.axis('off')		#取消坐标系
plt.show()

###
image pixel values:
 [[  0 120 230]
 [255  60 150]
 [100  60  30]]

1.2 二值图像

图像中只有两种像素值黑与白,黑:0,白:1。

示例:将上例中的灰度图像转换成二值图

c 复制代码
img_gray = np.array([[0,120,230],[255,60,150],[100,60,30]])
#像素值>127变成1,否则变成0
img_binary = np.where(img_gray>127,1,0)
print('binary image pixel values:\n',img_binary)
plt.imshow(img_binary,cmap='gray')
plt.title('Display binary image pixel values')
plt.show()

###
binary image pixel values:
 [[0 0 1]
 [1 0 1]
 [0 0 0]]

1.3 PNG格式图像

png格式图像一般为8bit图像,每个像素值对应+的RGB三分量通过查阅调色板获取。调色板数据样式:

索引号 R G B
0 0 0 0
... ... ... ...
255 255 255 255
  1. 每个png图片都有属于自己的调色板,调色板获取代码如下
c 复制代码
img_path = r'F:\pytorch_project\panda.png'
image = Image.open(img_path).convert('P')

if image.mode == 'P':
    palette = image.getpalette()
else:
    print('picture has no palette')
  1. 打印调色板信息列举了两种常用的方法。方法一:由于调色板每个索引编号对应三个颜色分量,所以可以对调色板列表直接变成ndarray变成最后维度为3的数组后转换成列表,并将结果变成字典{索引号:color元素}。方法二:对列表中相邻3个元素封装成一个颜色元组。
c 复制代码
# 方法一:对palette直接变形
palette_reshape = np.reshape(palette, (-1, 3)).tolist()
# 转换成字典子形式
palette_dict = dict((i, color) for i, color in enumerate(palette_reshape))
print(palette_dict)
print('-'*50)
# 方法二:对列表中相邻3个元素封装成一个颜色元组
palette_dict = {}
for i in range(0,len(palette),3):

    color = (palette[i],palette[i+1],palette[i+2])
    palette_dict[i//3] = color
    
print(palette_dict)
  1. 将字典数据存入json格式文件中。
c 复制代码
#将字典写入文件
json_str = json.dumps(pd)
with open("palette.json", "w") as f:
    f.write(json_str)

1.4 RGB格式图像

传统的红绿蓝三色图有三个通道,每个通道分量用8bit,取值范围:0~255,每个像素值共有24bit。

1.5 RGBA图像

图像为32bit,前24bit存储RGB三通道像素值,最后8bit存储透明度信息。

1.6 8位伪彩色图

每个像素值代表图像像素表的索引地址,在像素表中RGB三分量不完全相同。

索引号 R G B
255 0 0
绿 0 255 0
... ... ... ...
255 255 0

二、图像加载和格式转换

2.1图像加载方式

图像加载可以通过调用PIL库加载,也可以调用cv2库加载图像。

2.1.1 调用Image.open(img_path)加载图像
c 复制代码
img_path = r'F:\pytorch_project\plane.jpg'
image = Image.open(img_path)
img = np.array(image)
2.1.2 调用cv2.imread(img_path,flags=1)加载图像

flags属性:flags=0,提取单通道黑白图像。flags=1提取三通道彩色图像。

注意cv2.imread()提取的彩色图像格式为【H,W,C】,最后的通道维度顺序是BGR,在使用过程中需要对最后一个维度的数据进行转置操作变成熟悉的RGB格式(使用列表转置操作list[::-1])。

c 复制代码
# 1.提取单通道图片并展示
img_path = r'F:\pytorch_project\plane.jpg'
image = cv2.imread(img_path,flags=0)
img = np.array(image)
plt.imshow(img,cmap='gray')
plt.show()

# 2.提取彩色图片并展示
img_path = r'F:\pytorch_project\plane.jpg'
image = cv2.imread(img_path,flags=1)
img = np.array(image)
plt.imshow(img[:,:,::-1])
plt.show()

也可以使用cv2模块内的imshow()显示图片,但是需要设置关闭窗口的按键响应。

c 复制代码
img_path = r'F:\pytorch_project\plane.jpg'
image = cv2.imread(img_path,flags=1)	

img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('image',img_gray)

## 键入esc时退出,s保存退出
k = cv2.waitKey(0)
if k == 27:
    cv2.destoryAllWindows()
elif k == ord('s'):
    cv2.imwrite('img_1.jpg', img_gray)
    cv2.destoryAllWindows()

2.2 图像格式转换

图像转换成项目需要的格式调用函数为:Image.open(img_path).convert(format_str)
format_str参数:**'RGB','L', '1','P','RGBA', 'YCbCr'**等。

2.2.1 grayscale灰度图

可以从RGB图通过提取各通道像素值经过公式运算转换成灰度图,实现公式【gray = 0.299R+0.587 G+0.114*B】,也可以直接调用语句img.convert('L')或''转换格式。

c 复制代码
image = Image.open(img_path).convert('L')
plt.imshow(image,cmap='gray')
plt.show()

此外,img.convert('I')表示32位整型灰度图,img.convert('F')表示32为浮点型灰度图。

2.2.2 二值图像
c 复制代码
image = Image.open(img_path).convert('1')
2.2.3 RGB格式图像
c 复制代码
image = Image.open(img_path).convert('RGB')
2.2.4 PNG格式图像
c 复制代码
image = Image.open(img_path).convert('P')
2.2.5 RGBA图像

图像为32bit,前24bit存储RGB三通道像素值,最后8bit存储透明度信息,语法为:

c 复制代码
image = Image.open(img_path).convert('RGBA')
2.2.6 YCbCr图像

YCbCr图为24bit彩色图,Y表示亮度通道,Cb和Cr表示两个色度通道,肉眼对亮度通道敏感,对两个色度通道进行下采样。语法为:

c 复制代码
image = Image.open(img_path).convert('YCbCr')

除了上面介绍的使用PIL库的convert()函数进行格式转换,也可以使用cv2.cvtColor()函数进行图像格式转换。

三、区分numpy.array和torch.tensor存储图像维度变化

numpy.ndarray存储的图像维度为(宽、高、通道)【W,H,C】,torch.tensor存储的图像维度为(通道、宽、高)【C,W,H】,在使用过程中要根据具体使用需求对图像矩阵进行维度转换。

c 复制代码
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')

# image变成numpy.ndarray
img_np = np.array(image)
# image变成torch.tensor
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])

四、RGB各通道图像提取

对RGB各图层图像提取并展示有利于更直观了解图像的情况。

c 复制代码
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()
相关推荐
清醒的兰几秒前
OpenCV 滑动条调整图像对比度和亮度
人工智能·opencv·计算机视觉
先做个垃圾出来………2 分钟前
Flask中secret_key设置解析
后端·python·flask
weixin_517662144 分钟前
DAY 20 奇异值SVD分解
python
AndrewHZ1 小时前
【图像处理基石】立体匹配的经典算法有哪些?
图像处理·算法·计算机视觉·滤波·模式识别·立体匹配
YYXZZ。。1 小时前
PyTorch——线性层及其他层介绍(6)
pytorch·python·深度学习
AndrewHZ1 小时前
【图像处理入门】4. 图像增强技术——对比度与亮度的魔法调节
图像处理·算法·计算机视觉·几何变换·图像增强·模式识别
哆啦A梦的口袋呀1 小时前
基于Python学习《Head First设计模式》第三章 装饰者模式
python·学习·设计模式
哆啦A梦的口袋呀1 小时前
基于Python学习《Head First设计模式》第五章 单件模式
python·学习·设计模式
love530love1 小时前
【笔记】Windows 下载并安装 ChromeDriver
人工智能·windows·笔记·python·深度学习
Dxy12393102162 小时前
DrissionPage 异常处理实战指南:构建稳健的网页自动化防线
运维·爬虫·python·自动化·drissionpage