Tensor-, Numpy-, PIL-Formatkonvertierung und Bildanzeige

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
 

Supongo que te gusta

Origin blog.csdn.net/baidu_41617231/article/details/135391698
Recomendado
Clasificación