Comment puis-je requantiser la plage dynamique d'une image dans MATLAB?
-
12-11-2019 - |
Question
J'ai besoin de requantiser uniformément la plage dynamique d'une image basée sur les conversions de valeur de pixels suivantes:
Pixel Value: Quantized Value
0 - 64 : 31
65 - 128 : 95
129 - 192 : 159
193 - 255 : 223
Je souhaite remplacer toutes les valeurs de pixels dans les plages ci-dessus par les valeurs quantifiées. Comment puis-je coder ceci dans Matlab?
La solution
Une façon consiste à utiliser indexation logique. Étant donné une matrice d'image img
(qui pourrait être Niveaux de gris 2D ou RVB 3D), cela remplacera toutes vos valeurs:
img(img >= 0 & img <= 64) = 31;
img(img >= 65 & img <= 128) = 95;
img(img >= 129 & img <= 192) = 159;
img(img >= 193 & img <= 255) = 223;
Une autre option consiste à créer une table de recherche de 256 éléments et à utiliser les valeurs de votre image comme indices dans ce tableau:
lookupTable = [31.*ones(1,65) 95.*ones(1,64) 159.*ones(1,64) 223.*ones(1,63)];
img = uint8(lookupTable(double(img)+1));
Notez qu'avec cette solution, vous devrez être conscient de la classe de votre matrice d'image. De nombreuses images sont en classe uint8
, des valeurs couvrant 0 à 255. Pour utiliser ces valeurs comme un index, vous devez les convertir en une classe qui peut stocker des entiers plus grands (comme double
) Pour éviter la saturation à la valeur maximale de 255, alors en ajoutez-en un car vous avez besoin d'un index de 1 à 256. Vous voudriez alors convertir la matrice d'image résultante en classe uint8
.