libimage  0.25.4
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Énumérations Macros Pages
Fonctions membres publiques | Fonctions membres privées | Attributs privés | Liste de tous les membres
Référence du modèle de la classe TiffNodataManager< T >

Manipulation de la couleur de nodata. Plus de détails...

#include <TiffNodataManager.h>

Graphe de collaboration de TiffNodataManager< T >:
Collaboration graph

Fonctions membres publiques

 TiffNodataManager (uint16 channels, int *targetValue, bool touchEdges, int *dataValue, int *nodataValue, int tolerance=0)
 Crée un objet TiffNodataManager à partir des différentes couleurs.
virtual ~TiffNodataManager ()
 Destructeur par défaut.
bool treatNodata (char *inputImage, char *outputImage, char *outputMask=0)
 Fonction de traitement du manager, effectuant les modification de l'image.

Fonctions membres privées

bool identifyNodataPixels (T *IM, uint8_t *MSK)
 Identifie les pixels de nodata.
bool isTargetValue (T *pix)
 Détermine si un pixel contient la valeur cible.
void changeNodataValue (T *IM, uint8_t *MSK)
 Change la couleur des pixels de nodata.
void changeDataValue (T *IM, uint8_t *MSK)
 Change la couleur des pixels de donnée.

Attributs privés

uint32_t width
 Largeur de l'image en cours de traitement.
uint32_t height
 Hauteur de l'image en cours de traitement.
uint16_t samplesperpixel
 Nombre de canaux de l'image en cours de traitement.
uint16_t maxChannels
 Nombre de canaux des couleurs du manager.
T * targetValue
 Couleur concerné par les modifications éventuelles.
int tolerance
 Tolérance de la comparaison avec la valeur cible.
bool touchEdges
 Méthode de détection des pixels de nodata.
T * dataValue
 Nouvelle couleur pour les pixels de donnée.
T * nodataValue
 Nouvelle couleur pour les pixels de non-donnée.
bool removeTargetValue
 Doit-on modifier les pixels de données contenant la valeur cible targetValue.
bool newNodataValue
 Doit-on modifier la valeur des pixels de nodata ?

Description détaillée

template<typename T>
class TiffNodataManager< T >

Manipulation de la couleur de nodata.

Auteur
Institut national de l'information géographique et forestière

On veut pouvoir modifier la couleur de nodata d'images à canal entier, et ce pour des images qui ne possèdent pas de masque de données. De plus, on veut avoir la possibilité de supprimer une couleur d'une image pour la réserver au nodata. Typiquement, il est des cas où le blanc pur doit être exclusivement utilisé pour caractériser des pixels de nodata. On va alors remplacer le blanc de donnée (neige, écume, hot spot...) par du "gris clair" (254,254,254).

On va donc définir 3 couleurs :

Et la classe va permettre les actions suivantes :

Pour identifier les pixels de nodata, on peut utiliser l'option "touche les bords" (touchEdges) ou non en plus de la valeur cible.

On dit qu'un pixel "touche le bord" dès lors que l'on peut relier le pixel au bord en ne passant que par des pixels dont la couleur est celle cible. Techniquement, on commence par les bord puis on se propage vers l'intérieur de l'image.

manageNodata.png

Les fonctions utilisent les loggers et doivent donc être initialisés par un des appelant.

Documentation des constructeurs et destructeur

template<typename T >
TiffNodataManager< T >::TiffNodataManager ( uint16  channels,
int *  targetValue,
bool  touchEdges,
int *  dataValue,
int *  nodataValue,
int  tolerance = 0 
)

Crée un objet TiffNodataManager à partir des différentes couleurs.

Les booléens removeTargetValue et newNodataValue sont déduits des couleurs, si elles sont identiques ou non.

Paramètres
[in]channelsnombre de canaux dans les couleurs
[in]targetValuecouleur cible
[in]touchEdgesméthode de détection des pixels de nodata
[in]dataValuenouvelle couleur pour les données
[in]nodataValuenouvelle couleur pour les non-données

Documentation des fonctions membres

template<typename T >
void TiffNodataManager< T >::changeDataValue ( T *  IM,
uint8_t *  MSK 
)
private

Change la couleur des pixels de donnée.

Les pixels de nodata ont déjà été identifiés. Il se peut que des pixels de données soit de la couleur targetValue et qu'on veuille la changer (réserver une couleur aux pixels de nodata). On parcourt l'image et on change la valeur de ces derniers par dataValue.

Paramètres
[in,out]IMimage à modifier
[in]MSKmasque à utiliser
template<typename T >
void TiffNodataManager< T >::changeNodataValue ( T *  IM,
uint8_t *  MSK 
)
private

Change la couleur des pixels de nodata.

Les pixels de nodata ont déjà été identifiés. Reste à en changer la valeur par nodataValue.

Paramètres
[in,out]IMimage à modifier
[in]MSKmasque à utiliser
template<typename T >
bool TiffNodataManager< T >::identifyNodataPixels ( T *  IM,
uint8_t *  MSK 
)
private

Identifie les pixels de nodata.

Les pixels de nodata potentiels sont ceux qui ont la valeur targetValue. Deux méthodes sont disponibles :

  • Tous les pixels qui ont cette valeur sont du nodata
  • Seuls les pixels qui ont cette valeur et qui "touchent le bord" sont du nodata

Pour cette deuxième méthode, plus lourde, nous allons procéder comme suit. On identifie les pixels du bord dont la couleur est targetValue, et on les ajoute dans une pile (on stocke la position en 1 dimension dans l'image). On remplit en parallèle le masque de donnée, pour mémoriser les pixels identifié comme nodata.

Itérativement, tant que la pile n'est pas vide, on en prend la tête et on considère les 4 pixels autour. Si ils sont de la couleur dataValue et qu'ils n'ont pas déjà été traités (on le sait grâce au masque), on les ajoute à la pile. Ainsi de suite jusqu'à vider la pile.

Dans les deux acs, on remplit un buffer qui servira de masque afin de, au choix :

  • changer la valeur de nodata
  • changer la valeur des mixels de données qui ont la valeur targetValue (réserver une couleur aux pixels de nodata)
  • écrire le masque dans un fichier
Paramètres
[in]IMimage à analyser
[out]MSKmasque à remplir
Renvoie
VRAI si l'image contient au moins 1 pixel de nodata, FAUX si elle n'en contient pas
template<typename T >
bool TiffNodataManager< T >::isTargetValue ( T *  pix)
inlineprivate

Détermine si un pixel contient la valeur cible.

Un pixel est considéré comme de la couleur cible s'il appartient à l'intervalle définit par targetValue et tolerance

Paramètres
[in]pixpixel à tester
Renvoie
template<typename T >
bool TiffNodataManager< T >::treatNodata ( char *  inputImage,
char *  outputImage,
char *  outputMask = 0 
)

Fonction de traitement du manager, effectuant les modification de l'image.

Elle utilise les booléens removeTargetValue et newNodataValue pour déterminer le travail à faire. Si le travail consisite simplement à identifier le nodata et écrire un maque (pas de modification à apporter à l'image), l'image ne sera pas réecrite, même si un chemin différent pour la sortie est fourni.

Paramètres
[in]inputchemin de l'image à modifier
[in]outputchemin de l'image de sortie
[in]outputMaskchemin du masque de sortie
Renvoie
Vrai en cas de réussite, faux sinon

Voici le graphe d'appel pour cette fonction :

Documentation des données membres

template<typename T >
T* TiffNodataManager< T >::dataValue
private

Nouvelle couleur pour les pixels de donnée.

Elle peut être la même que la couleur cible targetValue. Dans ce cas, on ne touche pas aux pixels de donnée.

template<typename T >
bool TiffNodataManager< T >::newNodataValue
private

Doit-on modifier la valeur des pixels de nodata ?

On mettra la couleur nodataValue.

template<typename T >
T* TiffNodataManager< T >::nodataValue
private

Nouvelle couleur pour les pixels de non-donnée.

Elle peut être la même que la couleur cible targetValue. Dans ce cas, on ne touche pas aux pixels de non-donnée.

template<typename T >
bool TiffNodataManager< T >::removeTargetValue
private

Doit-on modifier les pixels de données contenant la valeur cible targetValue.

Cela peut être utile pour réserver une couleur aux pixels de nodata.

template<typename T >
bool TiffNodataManager< T >::touchEdges
private

Méthode de détection des pixels de nodata.

Part-on des bords pour identifier les pixels de nodata ?


La documentation de cette classe a été générée à partir du fichier suivant :