Python-Bildverarbeitung Numpy OpenCV Python-
Schlüsselpunkte
cv.imshow(): Das angezeigte Bild ist im BGR-Format
plt.imshow(): Das angezeigte Bild ist im RGB-Format
Tensor: Die gespeicherten Daten werden in [0, 1] verteilt.
Numpy: Die gespeicherten Daten werden in [0, 255] verteilt.
CIFAR-10-Datensatz
Der Datensatz liegt im RGB-Format vor.
Wenn opencv zur Anzeige verwendet wird, muss er zuerst in das BGR-Format konvertiert werden.
Wenn plt zur Anzeige verwendet wird, muss das Format nicht konvertiert werden.
Beispiel:
dict = unpickle('./dataset/cifar-10-batches-py/test_batch')
img = dict[b'data']
image = img[0]
image = image.reshape(3, 32, 32).transpose(1, 2, 0)
cv_show('image', image)
r, g, b = cv.split(image)
pic = cv.merge([b, g, r])
cv_show('pic', pic)
Das linke Bild ist das Originalbild und das rechte Bild ist das verzerrte Bild :
Formatkonvertierung
Import Torch
Import Numpy als NP
# Numpy in Tensor umwandeln oder umgekehrt
np_data = np.arange(6).reshape((2, 3))
Torch_data = Torch.from_numpy(np_data) # Ndarray in Tensor umwandeln
tensor2array = Torch_data.numpy() # Tensor in Ndarray umwandeln
test = out.cpu().detach().numpy() # Konvertieren von Tensor auf CUDA zu ndarray
Tensor ==> Numpy
import Torch
Import Torchvision
Import Pickle
Import CV2 als CV
transform_tensor = Torchvision.transforms.Compose([
Torchvision.transforms.ToTensor(),
])
transform_picture = Torchvision.transforms.Compose([
Torchvision.transforms.ToTensor(), # Tensor-Funktion
Torchvision.transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
])
def cv_show(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
def unpickle(file):
with open(file, 'rb') as fo:
dict = pickle.load(fo, binding='bytes')
return dict
dict = unpickle('./dataset/cifar-10-batches-py/test_batch')
img = dict[b'data']
image = img[0]
image = image.reshape(3, 32, 32).transpose(1, 2, 0)
print(image)
image_Tensor = transform_tensor(image).unsqueeze(0)
print(image_Tensor) # Keine Datennormalisierungsoperation
image_Tensor_Nor = transform_picture(image).unsqueeze(0)
print(image_Tensor_Nor) # Es gibt eine Datennormalisierungsoperation
[[[158 112 49]
[159 111 47]
[165 116 51]
...
[ 24 77 124]
[ 34 84 129 ]
[ 21 67 110]]]
Tensor([[[[0.6196, 0.6235, 0.6471, ..., 0.5373, 0.4941, 0.4549], [0.5961, 0.5922, 0.6235, ... , 0.5333, 0.4902
, 0.466 7],
[0,5922, 0,5922, 0,6196, ..., 0,5451, 0,5098, 0,4706],
...,
[0,6941, 0,5804, 0,5373, ..., 0,5725, 0,4235, 0,4980],
[0,6588, 0,5804, 0,5 176,.. . , 0,5098, 0,4941, 0,4196],
[0,6275, 0,5843, 0,5176, ..., 0,4863, 0,5059, 0,4314]]]])
tensor([[[[ 0,6338, 0,6531, 0,7694, ..., 0,2267 , 0 . 0134, - 0,1804],
[ 0,5174, 0,4981, 0,6531, ..., 0,2073, -0,0060, -0,1223], [ 0,4981, 0,4981, 0,6338,
..., 0,2654, 0,0910, -0,1029],
...,
[ 1,2319, 0,6661, 0,4515, ..., 0,6271, -0,1143, 0,2564],
[ 1,0563, 0,6661, 0,3540, ..., 0,3149, 0,2369, -0,1338], [ 0,9003, 0,6856, 0. 3540 ,
..., 0.1979, 0,2954, - 0,0753]]]])
Tensor zu Numpy: (zur Anzeige von Bildern)
Mittelwert = (0,4914, 0,4822, 0,4465)
Standard = (0,2023, 0,1994, 0,2010)
def tensor_numpy(image):
clean = image.clone().detach().cpu().squeeze(0) # Entfernen Sie den Batch-Kanal (batch, C, H, W) -> (C, H, W)
clean [0] = clean[0] * std[0] + mean[0] # Datennormalisierung
clean[1] = clean[1] * std[1] + mean[1]
clean[2] = clean[ 2] .mul(std[2]) + mean[2]
clean = np.around(clean.mul(255)) # In Farbe konvertieren 255 [0, 1] --> [0, 255]
clean = np. uint8( clean).transpose(1, 2, 0) # Drei Kanäle transponieren (C, H, W) -> (H, W, C)
r, g, b = cv.split(clean) # RGB-Kanalkonvertierung
clean = cv.merge([b, g, r])
kehrt sauber zurück
Num = tensor_numpy(image_Tensor_Nor)
print(Num)
Wenn Sie cv.imshow() verwenden, müssen Sie die obige RGB-Kanalkonvertierung verwenden;
wenn Sie plt.imshow() verwenden, müssen Sie die obige RGB-Kanalkonvertierung nicht verwenden;
Beispiel:
plt.imshow('image', image)
plt.show()
RGB-Format:
[[[158 112 49]
[159 111 47]
[165 116 51]
...
[ 24 77 124]
[ 34 84 129]
[ 21 67 110]]]
RGB-Kanalkonvertierung:
r, g, b = cv.split(image)
pic = cv.merge([b, g, r])
plt.imshow('image', pic)
plt.show()
BGR-Funktion:
[[[ 49 112 158]
[ 47 111 159]
[ 51 116 165]
...
[124 77 24]
[129 84 34]
[110 67 21]]]
PyTorch save_image()
Torchvision.utils.save_image()
Schauen wir uns abschließend an, wie die integrierte Funktion von Pytorch die Formatkonvertierung durchführt und Bilder speichert:
def save_image(
Tensor: Union[torch.Tensor, List[torch.Tensor]],
fp: Union[Text, pathlib.Path, BinaryIO],
Format: Optional[str] = None,
**kwargs
)
grid = make_grid(tensor, **kwargs)
# Addiere 0,5 nach der Denormalisierung zu [0, 255], um auf die nächste ganze Zahl zu runden.
ndarr = grid.mul(255).add_(0.5).clamp_(0, 255).permute(1 , 2, 0).to('cpu', Torch.uint8).numpy()
im = Image.fromarray(ndarr)
im.save(fp, format=format)
Die Wissenspunkte des Artikels stimmen mit den offiziellen Wissensarchiven und überein Weitere relevante Informationen können untersucht werden