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的格式讀取。
接著:
當執(zhí)行 [:,:,::-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)是什么顏色的,發(fā)現是藍色的。

所以,如果拆測沒錯的話,這是后顯示出來的圖片應該左上角就是藍色的,我們試試:
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()函數顯示圖片發(fā)現跟我們打開圖片的樣子一樣,是因為cv2的imshow()又把BGR轉回RGB再顯示。但cv2確實是以BGR形式讀取圖片的,而plt則是以RGB形式。
