img[...,::-1]或者img[:,:,::-1]的作用
作用是实现RGB到BGR通道的转换 (若图片一开始就是BGR的,就是实现从BGR到RGB的转换)。
对于列表img进行img[:,:,::-1]的作用是列表数组左右翻转,例如:
import numpy as np
a = np.arange(27).reshape(3,3,3)
print(a)
'''
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
'''
b = a[:,:,::-1]
print(b)
'''
[[[ 2 1 0]
[ 5 4 3]
[ 8 7 6]]
[[11 10 9]
[14 13 12]
[17 16 15]]
[[20 19 18]
[23 22 21]
[26 25 24]]]
'''
可以明确看出,[:,:,::-1]的作用就是对数组进行左右翻转。那为什么对于图像而言却能实现RGB通道转换为BGR通道呢?先看一些读取图片的方法是怎么读取吧
一般有opencv(cv2)和matplotlib(plt)的读取方式:(cv2把图片读取后是把图片读成BGR形式的,plt则是读成RGB形式)
证明如下:
以一张图片为样例:
正常显示就是以RGB为格式显示的。
当我们用plt读取时:
from matplotlib import pyplot as plt
import cv2
img_name = r'C:\Users\Administrator\Desktop\airball\val\35.jpg'
img = plt.imread(img_name)
print(img)
打印出来的是:
取第一个值,(129,80,73),在网上以查,颜色是深棕色的,确实跟图片的左上角是一致的:
证明plt读取图片的方式确实是以RGB的格式读取。
接着:
当执行 [:,:,::-1]后,数组会左右翻折:
from matplotlib import pyplot as plt
import cv2
img_name = r'C:\Users\Administrator\Desktop\airball\val\35.jpg'
img = plt.imread(img_name)
print(img)
print('-----------------------')
img = img[:, :, ::-1]
print(img)
,
可以看到(129 80 73)变成(73 80 129)。
通过网上查询(73 80 129)是什么颜色的,发现是蓝色的。
所以,如果拆测没错的话,这是后显示出来的图片应该左上角就是蓝色的,我们试试:
from matplotlib import pyplot as plt
import cv2
img_name = r'C:\Users\Administrator\Desktop\airball\val\35.jpg'
img = plt.imread(img_name)
print(img)
print('-----------------------')
img = img[:, :, ::-1]
plt.imshow(img)
plt.show()
果然左上角就是蓝色的。因此,这应该是BRG格式的图片了。所以得证,[:,:,::-1]的作用就是把RGB(或BRG)转换成BGR(或者RGB)。
=============================
插一句题外话,用opencv(即cv2)读取图片,是以BGR的形式来读取的。我们用cv2的imshow()函数显示图片发现跟我们打开图片的样子一样,是因为cv2的imshow()又把BGR转回RGB再显示。但cv2确实是以BGR形式读取图片的,而plt则是以RGB形式。