cv2 库是 OpenCV库 的 Python 版本。
cv2.imread 读取 RGB 图像,得到的 data 是 BGR 的,即 data[:,:,0] 是 Blue 通道,data[:,:,1] 是 Green通道,data[:,:,2] 是 Red 通道。
data.shape = (H,W,C)。
注意:
- 如果需要的是 data 的通道按照 RGB 顺序排列的 data,可以执行
pic_data = cv2.cvtColor(pic_data, cv2.COLOR_BGR2RGB) # BGR -> RGB
。比如 matplotlib 库就需要通道按照 RGB 顺序排列的 data 。 - cv2.imread 得到的 data 的 shape 是 (H,W,C) 的,但是 PyTorch 需要的 Tensor 的 shape 是 (B,C,H,W)的,所以需要执行
data.permute(2, 0, 1) # (H,W,C) -> (C,H,W)
。 - matplotlib.pyplot.scatter(x,y) x 是 水平轴的索引, y 是 竖直轴的索引。
import cv2
import numpy as np
import torch
import torch.nn.functional as F
pic_name = 'forest.png'
pic_data = cv2.imread(pic_name, cv2.IMREAD_UNCHANGED) # BGR(Blue Green Red)
print("Data's type: ", type(pic_data))
print("Data's shape: ", pic_data.shape) # (H,W,C)
print("Data's data:\n",pic_data,"\n")
pic_data = cv2.cvtColor(pic_data, cv2.COLOR_BGR2RGB) # BGR -> RGB
pic_shape = pic_data.shape # (H,W,C)
print("Data's shape after cv2.COLOR_BGR2RGB: ", pic_data.shape)
print("Data's data after cv2.COLOR_BGR2RGB:\n",pic_data,"\n")
pic_data = torch.from_numpy(pic_data)
pic_type = type(pic_data)
pic_shape = pic_data.shape
print("Data's type: ", type(pic_data))
print("Data's shape: ", pic_data.shape)
pic_data = pic_data.permute(2, 0, 1) # (H,W,C) -> (C,H,W)
print("Data's shape after permute: ", pic_data.shape)
print("Data's data after permute\n",pic_data)
输出如下:
Data's type: <class 'numpy.ndarray'>
Data's shape: (1414, 1885, 3)
Data's data:
[[[ 32 28 0]
[ 76 72 37]
[156 151 118]
...
[ 30 45 18]
[ 15 34 7]
[ 14 34 11]]
[[152 147 114]
[116 111 78]
[ 45 40 7]
...
[ 43 57 29]
[ 33 50 23]
[ 20 36 12]]
[[225 222 191]
[253 250 219]
[147 144 113]
...
[ 50 60 30]
[ 52 64 36]
[ 39 45 20]]
...
[[ 51 67 83]
[ 35 53 64]
[ 43 62 65]
...
[176 191 224]
[125 134 168]
[ 12 17 50]]
[[ 46 63 76]
[ 29 48 56]
[ 33 53 54]
...
[ 50 67 100]
[132 142 176]
[111 120 153]]
[[ 32 50 61]
[ 33 52 59]
[ 43 63 64]
...
[ 7 26 59]
[ 81 93 127]
[128 139 171]]]
Data's shape after cv2.COLOR_BGR2RGB: (1414, 1885, 3)
Data's data after cv2.COLOR_BGR2RGB:
[[[ 0 28 32]
[ 37 72 76]
[118 151 156]
...
[ 18 45 30]
[ 7 34 15]
[ 11 34 14]]
[[114 147 152]
[ 78 111 116]
[ 7 40 45]
...
[ 29 57 43]
[ 23 50 33]
[ 12 36 20]]
[[191 222 225]
[219 250 253]
[113 144 147]
...
[ 30 60 50]
[ 36 64 52]
[ 20 45 39]]
...
[[ 83 67 51]
[ 64 53 35]
[ 65 62 43]
...
[224 191 176]
[168 134 125]
[ 50 17 12]]
[[ 76 63 46]
[ 56 48 29]
[ 54 53 33]
...
[100 67 50]
[176 142 132]
[153 120 111]]
[[ 61 50 32]
[ 59 52 33]
[ 64 63 43]
...
[ 59 26 7]
[127 93 81]
[171 139 128]]]
Data's type: <class 'torch.Tensor'>
Data's shape: torch.Size([1414, 1885, 3])
Data's shape after permute: torch.Size([3, 1414, 1885])
Data's data after permute
tensor([[[ 0, 37, 118, ..., 18, 7, 11],
[114, 78, 7, ..., 29, 23, 12],
[191, 219, 113, ..., 30, 36, 20],
...,
[ 83, 64, 65, ..., 224, 168, 50],
[ 76, 56, 54, ..., 100, 176, 153],
[ 61, 59, 64, ..., 59, 127, 171]],
[[ 28, 72, 151, ..., 45, 34, 34],
[147, 111, 40, ..., 57, 50, 36],
[222, 250, 144, ..., 60, 64, 45],
...,
[ 67, 53, 62, ..., 191, 134, 17],
[ 63, 48, 53, ..., 67, 142, 120],
[ 50, 52, 63, ..., 26, 93, 139]],
[[ 32, 76, 156, ..., 30, 15, 14],
[152, 116, 45, ..., 43, 33, 20],
[225, 253, 147, ..., 50, 52, 39],
...,
[ 51, 35, 43, ..., 176, 125, 12],
[ 46, 29, 33, ..., 50, 132, 111],
[ 32, 33, 43, ..., 7, 81, 128]]], dtype=torch.uint8)
举个例子
import numpy as np
import cv2
import matplotlib.pyplot as plt
pic_name = 'PYY.png'
pic_data = cv2.imread(pic_name, cv2.IMREAD_UNCHANGED) # BGR(Blue Green Red)
imgplot = plt.imshow(pic_data)
plt.show()
原图如下
用 cv2.imread 导入后再直接用 matplotlib show出来的效果如下:
uv 坐标
u 是水平轴
v 是竖直轴