图像领域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形式。

发布了270 篇原创文章 · 获赞 408 · 访问量 76万+

猜你喜欢

转载自blog.csdn.net/u014453898/article/details/93716118
IMG