PROCEDE DE CONVERSION D'IMAGES POUR PRESENTATION SOUS
FORME BITMAP
La présente invention se rapporte à un procédé de conversion d'images pour présentation sous forme bitmap.
L'acquisition d'images dans des domaines tels que l'échographie médicale, les radars, les lidars ou les sonars est généralement réalisée par des « tirs » de faisceaux d'émission, leurs échos étant recueillis dans la direction des faisceaux d'émission. Ces échos se traduisent, à la réception, par des valeurs de luminance de points disposés, après traitement de données, sur les différentes directions des faisceaux, qui sont généralement parallèles ou radiaux. Or, les dispositifs d'affichage couramment utilisés ont un affichage « bitmap » et sont soit des écrans à balayage de type télévision ou à pixels à disposition matricielle (écrans à cristaux liquides). Les pixels de ces dispositifs d'affichage ont en général une densité plus élevée que celle des échos et une disposition différente. Il est donc nécessaire, pour constituer une image « bitmap », de convertir les différents points recueillis, ou plus exactement leurs luminances respectives, en points à disposition matricielle, et d'interpoler entre les points recueillis afin de pouvoir présenter une image « bitmap » sans lacunes.
La présente invention a pour objet un procédé de conversion d'images acquises selon des « tirs » parallèles et/ou radiaux en images de type bitmap, procédé qui permette un traitement le plus rapide possible.
Le procédé conforme à l'invention consiste, consiste, avant une séquence de tirs, et pour un format d'affichage bitmap donné, à déterminer pour chaque point de la bitmap, s'il appartient à un polygone d'analyse, chaque polygone d'analyse étant défini par au moins deux points consécutifs d'un tir et par les deux points de même rang du tir suivant, et si oui, à le chaîner au dernier point de la bitmap trouvé dans ce polygone, à déterminer sa position dans le polygone, à réorganiser les données ainsi recueillies selon l'ordre d'arrivée des points dans l'ordre des tirs, à repérer le dernier point de chaque polygone non vide, à associer à chacun des polygones vides un point déterminé de la bitmap, puis, pendant les tirs, à produire pour chaque point reçu un opérande comportant les luminances d'au moins quatre des sommets du polygone dont le point en question est le dernier sommet reçu qui l'identifie, à ranger ces opérandes dans l'ordre de réception des
points correspondants, et, à la fin de chaque tir, à calculer la luminance de chaque point contenu dans chacun des polygones pris dans l'ordre de réception des sommets les identifiant, ce calcul étant fait selon une loi d'interpolation appropriée à partir des luminances d'au moins les sommets du polygone contenant le point en question, le passage d'un polygone au suivant étant commandé lors de la détection du dernier point contenu dans ce polygone, à mémoriser les luminosités des points ainsi calculés et à produire l'image bitmap en lisant les luminosités des points ainsi mémorisés.
De façon avantageuse, les polygones sont des quadrilatères. Selon une autre caractéristique de l'invention, pendant le traitement d'un ensemble de points de la bitmap, on force le chargement en mémoire cache des données nécessaires au traitement d'un ensemble suivant de points de la bitmap.
Selon encore une autre caractéristique de l'invention, les coefficients de la loi d'interpolation sont stockés dans une table adressée par la position des points dans le polygone examiné.
Selon encore une autre caractéristique de l'invention, on constitue une table de données contenant les adresses cartésiennes de chaque point de la bitmap et sa position relative à l'intérieur du polygone correspondant. Selon encore une autre caractéristique de l'invention, ladite table de données est organisée dans l'ordre croissant des tirs et des polygones acquis et qu'elle contient une information signalant le dernier point du polygone en question.
Selon encore une autre caractéristique de l'invention, on constitue une table contenant les opérandes de luminance des sommets de chaque polygone, dans l'ordre d'acquisition de ces polygones, avant de calculer les luminances des points de la bitmap.
Selon encore une autre caractéristique de l'invention, on constitue une table donnant, pour chaque tir, les indices du premier et du dernier polygones visibles dans la bitmap.
Selon encore une autre caractéristique de l'invention, on constitue une table globale donnant, pour chaque tir, les adresses de la première entrée et de la dernière entrée du tableau de données bitmap pour une bitmap donnée.
Selon encore une autre caractéristique de l'invention, le point de bitmap associé à chacun des polygones vides est le même pour tous ces polygones.
Selon encore une autre caractéristique de l'invention, le point produit pour chacun des polygones vides est un point du bord de la bitmap, qui est blanchi ou noirci à la fin du calcul de la bitmap selon la couleur du fond de la bitmap.
Selon encore une autre caractéristique de l'invention, le procédé est appliqué à l'un au moins des domaines suivants : imagerie médicale ultrasonore, caméra acoustique, radar, appareil de RMN.
La présente invention sera mieux comprise à la lecture de la description détaillée d'un mode de mise en œuvre, pris à titre d'exemple non limitatif et illustré par le dessin annexé, sur lequel :
• la figure 1 est un diagramme simplifié relatif à un procédé de conversion d'images de l'art antérieur ; et
• la figure 2 est un diagramme simplifié servant à expliquer le procédé de l'invention.
L'invention est décrite ci-dessous en référence à la conversion d'images d'échographie médicale, mais il est bien entendu qu'elle n'est pas limitée à cette seule application, et qu'elle peut être mise en œuvre pour la conversion d'images fournies par divers appareils fonctionnant selon le principe de « tirs », et balayant une portion d'espace, que ces tirs soient parallèles entre eux et/ou radiaux, comme par exemple les radars, les sonars, le RMN, ... On a représenté en figure 1 , de façon simplifiée, deux lignes de tir consécutives et immatérielles 1, 2 d'une sonde d'échographie.
Ces deux lignes sont radiales (divergentes), mais les explications ci-dessous restent valables si ces lignes sont parallèles entre elles. Le rang de la ligne 1 , dans l'ordre de tir des différentes lignes est i, et celui de la ligne 2 est i+1. Sur chacune de ces deux lignes, on a représenté les échos consécutifs par des points : pour la ligne 1 , ils sont références Pj-1, Pj, Pj+1, Pj+2, ... et ... Qj-1, Qj, Qj+1, Qj+2 ... pour la ligne 2, les indices ...j-1 , j, j+1, ... correspondant à des mêmes distances de tir d'une ligne à la suivante. On a, d'autre part, représenté trois lignes consécutives et immatérielles 3, 4, 5 parallèles entre elles et sur lesquelles sont alignés les points régulièrement
espacés d'une image bitmap (matricielle) telle qu'affichée sur un écran de moniteur à tube cathodique ou un écran à cristaux liquides ou à plasma. Sur le dessin, qui est représenté relativement loin de la sonde de laquelle partent les lignes de tir, la densité des points bitmap est plus élevée que celle des points P et Q des lignes 1 et 2, mais il est bien entendu qu'au voisinage de la sonde, l'inverse peut être vrai. Sur la figure 1, les lignes 3, 4, 5 passent entre les points Pj et Pj+1 d'une part, et entre les points Qj et Qj+1, et dix des points de ces trois lignes sont compris dans le quadrilatère 6 dont les quatre sommets sont Pj, Pj+1, Qj, Qj+1. Soit A un de ces dix points, situé sur la ligne 4. Ce point, comme tous les autres points de la bitmap, a des coordonnées cartésiennes x et y, et sa luminance est notée Lx,y car elle dépend de sa position par rapport aux points « lumineux » Pj, Pj+1, Qj et Qj+1, qui sont les seuls points lumineux au voisinage immédiat de A. On pourrait également tenir compte des points non immédiatement voisins de A et situés sur les lignes 1 et 2 et/ou sur les lignes précédente et suivante, mais, en général, cela complique le calcul sans améliorer notablement l'image bitmap.
De façon bien connue, la luminance Lxy du point A est calculée de la façon suivante. Soient Lij, Li,j+1, Li+1,j et Li+1,j+1, les luminances respectives des points Pj, Pj+1, Qj, Qj+1 et a, b, c, d des coefficients dépendant des distances relatives du point A auxdits quatre sommets du quadrilatère 6. On a alors :
Lxy = aLij + bLij+1 + cLi+1j + dLi+1j+1 Une telle combinaison linéaire de quatre luminances n'est pas la seule façon possible de calculer Lxy, qui peut être calculée selon d'autres types de combinaison (non linéaire, avec plus de quatre points, ...).
A partir de ces données, le processus de conversion effectue les étapes E1 à E5 suivantes :
E1 - Dès la fin du calcul de la luminosité d'un point de la bitmap, il détermine les coordonnées (x,y) du prochain point à afficher.
E2 - Il détermine le quadrilatère d'analyse auquel appartient ce prochain point. E3 - Il calcule les coefficients d'interpolation (a, b, c, d) relatifs à ce prochain point.
E4 - Il calcule la luminance de ce prochain point à partir des coefficients d'interpolation précités. E5 - Il stocke cette valeur de luminance dans la mémoire définissant la bitmap. En général, chaque tir et les données de luminance qui en résultent ont lieu en séquence, et il peut être avantageux, aussitôt après avoir effectué deux tirs successifs, de calculer les luminances de tous les points de la bitmap situés entre les lignes (lignes de tir) relatives à ces deux tirs. On connaît deux approches différentes pour mettre en œuvre le processus de conversion rappelé ci-dessus.
Selon la première approche, les étapes E1 à E5 sont réalisées en temps réel, au fur et à mesure de l'acquisition des données de la luminance. Le brevet US-A-5 957846, par exemple, décrit un algorithme permettant de réaliser l'étape E1 en adressant une bitmap par exploration polaire (rotation d'une ligne de balayage autour d'un point fixe situé à l'intersection des lignes de tir). Ce procédé requiert peu de mémoire de stockage, mais nécessite beaucoup de calculs.
Selon une deuxième approche, qui s'applique lorsque les points de la bitmap ont une position fixe d'une trame d'image à la suivante par rapport aux quadrilatères d'analyse, les étapes E1 à E3 sont calculées une fois pour toutes. On produit alors un tableau de données, stockées en mémoire. Ce tableau comporte les coordonnées successives (x, y) des points de la bitmap, leurs quadrilatères d'appartenance, leurs coefficients d'interpolation. Les données de ce tableau sont ensuite appelées en temps réel, au fur et à mesure des tirs successifs pour les calculs de l'étape E4. Ce procédé est techniquement réalisable depuis que les mémoires des processeurs courants sont suffisamment grandes (typiquement, la capacité de mémoire requise est de quelques mégaoctets). Actuellement, la deuxième approche a tendance à supplanter la première du fait qu'elle est plus rapide et requiert moins de moyens de calcul que la première, les processeurs actuels les plus performants étant suffisants pour réaliser en temps réel les calculs nécessaires. Cependant, la mise en œuvre de cette deuxième approche est relativement complexe et ne peut pas être faite sur des ordinateurs personnels courants, en particulier si l'on
utilise des sondes ultrasonores à grand nombre d'éléments piézoélectriques. En effet, le nombre de points compris dans un quadrilatère d'analyse est variable (de zéro à l'ensemble de la bitmap), selon le facteur de zoom et la localisation du quadrilatère. De plus, certains quadrilatères peuvent ne contenir aucun point de bitmap. Il en résulte une complexité dans la logique de déroulement et de branchement de l'algorithme, qui passe beaucoup de temps à chercher le prochain quadrilatère non vide, ce temps passé « improductif », étant trop important par rapport au temps mis à calculer la luminance des points de la bitmap. Une autre conséquence est qu'il est difficile d'anticiper le déroulement précis du processus. Ceci est gênant en particulier lorsque l'on veut utiliser un processeur d'ordinateur personnel pour réaliser la conversion. En effet, un tel processeur dispose d'une mémoire cache beaucoup plus rapide que la mémoire centrale (de grande capacité en général), mais cette mémoire cache est de capacité limitée, et ne permet pas de stocker l'intégralité du tableau de données tel que défini selon le procédé connu.
La présente invention permet d'utiliser les instructions de préchargement en mémoire cache pour y stocker à l'avance les données du tableau de données qui seront demandées dans un futur proche et prévisible. Elle n'est donc plus tributaire du recours à la mémoire centrale dont les temps d'accès sont trop lents. Ceci est rendu possible grâce à un déroulement de programme très simple permettant d'identifier à coup sûr les instants où l'on doit précharger en mémoire cache les données à utiliser ultérieurement. Le procédé de l'invention organise le tableau de données relatif aux points de la bitmap et à leurs données associées quadrilatère par quadrilatère, ces quadrilatères étant classés dans l'ordre de leur formation, c'est-à-dire dans l'ordre de réception de leur dernier sommet (sommet inférieur droit) : par exemple pour le cas de la figure 1, le quadrilatère 6 (dont le dernier sommet reçu est Qj+1 ) vient aussitôt après le quadrilatère 6A (dont le dernier sommet reçu est Qj), et il est immédiatement suivi du quadrilatère 6B (dont le dernier sommet reçu est Qj+2).
Le seul branchement attendu se produit donc lorsque l'on a traité le dernier point de bitmap d'un quadrilatère et que l'on doit passer au point à traiter suivant (le branchement consiste à répondre à la question : « le point
venant après celui qui vient d'être traité est-il situé dans le quadrilatère suivant ? »). Le problème est qu'il peut se produire des cas où le prochain quadrilatère contenant au moins un point de la bitmap ne soit pas le suivant, mais le deuxième ou le troisième voisin. Ce genre de situation se présente en particulier lorsque les quadrilatères sont ceux d'une zone proche de la sonde. Dans une telle zone, la densité des points d'analyse (échos reçus par la sonde) est supérieure à la densité des points de la bitmap. Il n'y a donc pas, en moyenne, un point de bitmap par quadrilatère d'analyse.
Le procédé de l'invention permet de résoudre cette difficulté grâce à une caractéristique expliquée ci-dessous en référence à la figure 2. Sur cette figure 2, on a représenté plusieurs lignes de tir successives divergentes 7 à 13 (issues d'une sonde non représentée) et le contour 14 d'une image bitmap dans la position de visualisation désirée de cette image par rapport à ces lignes de tir. Dans l'exemple représenté sur cette figure, l'image est zoomée et la bitmap ne représente pas l'intégralité de l'image acquise. La bitmap intersecte par exemple les lignes de tir 8 à 12. Pour simplifier le dessin, on n'a représenté des points d'analyse que pour les lignes 9 et 10. Les points d'analyse sont, de façon générale, référencés Pi j, l'indice i étant le numéro d'ordre du tir et l'indice j le numéro d'ordre du point sur la ligne de tir considérée. Sur la ligne 9 (i = 9), les cinq points d'analyse contenus dans le contour 14 sont, respectivement, P9j, P9J+1, ... P9J+4 (j est le rang du premier point de la ligne 9 visible dans le contour 14). Sur la ligne 10 (i = 10), les cinq points d'analyse contenus dans le contour 14 sont, respectivement : P10J, P10,j+1, ... P10,+4. Les quadrilatères d'analyse sont repérés par exemple par les coordonnées de leur sommet supérieur gauche. Ainsi, les quadrilatères compris entre les lignes 9 et 10 et comprenant des points visibles dans la bitmap 14 sont les quadrilatères référencés par les points P9,j-1 à P9,j+4. La règle adoptée par l'invention est que si le premier quadrilatère comprenant des points visibles dans la bitmap est Pij et si le dernier quadrilatère comprenant des points visibles dans la bitmap est (Pi+nj+n) alors tous les quadrilatères intermédiaires seront supposés contenir chacun au moins un point visible, pour lequel une luminance sera calculée et affichée. Dans le cas où un de ces quadrilatères intermédiaires n'inclut aucun point de la bitmap, on lui associe un point factice unique, commun à tous les quadrilatères vides, par exemple le premier point de la
bitmap (le premier en haut, à gauche). On n'effectue aucun calcul pour les quadrilatères antérieurs à Pij et ceux postérieurs à Pi+n j+n. Ainsi, plutôt que de perdre du temps à effectuer un branchement, le procédé de l'invention consiste à parcourir systématiquement tous les quadrilatères de Pij à Pi+nj+n et à effectuer pour chacun d'eux au moins un calcul de luminance. Si un quadrilatère est vide ou s'il ne contient qu'un seul point de la bitmap, on considère qu'il contient un point unique (factice ou réel) et ce point est aussi considéré comme dernier point du quadrilatère, ce qui est signalé par un bit spécial (décrit ci-dessous). Si un quadrilatère comporte plusieurs points, le dernier d'entre eux (dans le sens du balayage de la bitmap) est également signalé par un bit spécial. Ce bit spécial commande l'incrémentation de la lecture du tableau de données (tableau de luminances des sommets des quadrilatères) pour passer à la lecture des données relatives au quadrilatère suivant (vide ou non) dès la fin des calculs relatifs au dernier point du quadrilatère en cours d'analyse. Ainsi, on évite la perte de temps causée par la recherche du quadrilatère non vide suivant.
On va maintenant décrire en détail le déroulement du processus de conversion d'image selon la présente invention.
1) - Préparation du tableau de données et de tableaux d'index
Cette phase débute dès que l'on a fait un choix de géométrie d'image ou de facteur de zoom et que l'on veut commencer l'analyse.
Il n'est pas nécessaire de l'optimiser, car on dispose typiquement de quelques dixièmes de seconde pour cette phase sans que cela crée une gêne pour l'utilisateur de l'échographe.
Cette phase se déroule de la façon suivante. Pour chaque point
(de coordonnées rectangulaires x, y) de la bitmap, on détermine s'il appartient à un quadrilatère d'analyse. Si oui, on le chaîne au dernier point trouvé dans ce quadrilatère, si ce dernier point existe. On détermine aussi la position de ce point dans le quadrilatère.
Dans le présent exemple, cette position est dénommée
« POS » et sa valeur se compose de la partie fractionnaire de i (indice de tir), sur 5 bits et de la partie fractionnaire de j (indice du point analysé sur la ligne de tir), sur 3 bits. Les paramètres i et j sont les
coordonnées polaires des points traités, obtenues par transformation des coordonnées cartésiennes des points de la bitmap (ces coordonnées cartésiennes sont x et y) . On utilise le chaînage précité pour ranger les données par ordre croissant de leurs quadrilatères d'appartenance. Le tableau comporte une entrée par point de bitmap situé dans un de ces quadrilatères. Chaque entrée du tableau (sur 32 bits par exemple) comporte donc les données suivantes (relatives à un seul point) :
> l'adresse (en x, y) du point de bitmap considéré, codée linéairement (par exemple sur 23 bits) ;
> sa position (« POS ») dans son quadrilatère (par exemple sur 8 bits, comme précisé ci-dessus) ; et
> un drapeau (« flag ») qui est validé si le point en question est le dernier point du quadrilatère (par exemple sur 1 bit).
Lorsque le quadrilatère analysé ne comporte aucun point visible de la bitmap, on génère une entrée comportant une valeur nulle en tant qu'adresse dans la bitmap (point supérieur gauche), une valeur nulle pour la position dans le quadrilatère examiné et 1 pour le bit de drapeau.
A la fin de cette phase de préparation, on dispose aussi d'un tableau d'index indiquant, pour chaque tir, la première et la dernière entrées du tableau de données relatif à ce tir, ainsi que les numéros d'ordre du premier et du dernier quadrilatères visibles pour ce tir.
- Pendant les tirs
De façon à accélérer le calcul final, qui comporte quatre multiplications et trois additions pour obtenir la luminance de chaque point, l'invention prévoit d'utiliser les instructions à opérandes multiples disponibles avec les processeurs INTEL (instructions de type SIMD ou MMX). Parmi ces instructions, il y a en particulier une opération qui réalise en une seule fois quatre multiplications et deux additions. Sachant qu'en général un quadrilatère peut contenir
plusieurs points de la bitmap (sauf les cas particuliers au voisinage de la sonde cités ci-dessus), il est avantageux de générer à chaque fois que l'on reçoit une nouvelle donnée de tir un opérande multiple qui concatène les quatre valeurs de luminance des sommets du quadrilatère dont le dernier point reçu est le sommet bas droit. Ces données sont en volume limité, et peuvent donc toutes résider dans la mémoire cache du processeur pour le calcul ultérieur de la luminance des points de bitmap. Selon un exemple de réalisation, les quatre valeurs de luminance (La, Lb, Le, Ld) sont définies chacune sur 16 bits et concaténées en un opérande de 64 bits, et d'autre part, les quatre coefficients (a, b, c, d), définis également sur 16 bits, sont concaténés, dans le même ordre, en un opérande de 64 bits. Ensuite, La, Lb, Le et Ld sont respectivement multipliés par a, b, c, d, et une première addition consiste à additionner simultanément d'une part aLa + bLb, ce qui donne un résultat partiel E, et d'autre part cLc + dLd, ce qui donne un autre résultat partiel F, ces deux résultats partiels étant concaténés en un mot de 64 bits, et enfin à effectuer une seconde addition E + F.
- A la fin de chaque tir.
A la fin de chaque tir, on réalise l'opération de conversion, réduite à sa plus simple expression, à savoir une boucle de calcul portant sur l'ensemble des entrées du tableau de données relatives au tir en question, ce tableau étant formé pendant la phase de préparation. Cette boucle effectue les calculs cités ci-dessus, à savoir la multiplication des luminances des quatre sommets du quadrilatère en cours d'analyse par les coefficients d'interpolation du point de bitmap considéré. Les luminances ont été acquises pendant les tirs et mémorisées en mémoire cache et les coefficients sont stockés dans un tableau constant d'opérandes multiples, résidant également en mémoire cache. Ce tableau de coefficients est indexé par la valeur (« POS ») de l'entrée considérée du tableau de données. En utilisant les instructions SIMD du processeur précité, il suffit d'une opération de multiplication - accumulation suivie d'une addition, et d'une
normalisation par décalage (mise à l'échelle). On obtient ainsi directement la luminance du point de bitmap analysé, qu'il suffit de stocker dans la mémoire de bitmap à son adresse, qui est fournie par l'entrée considérée du tableau de données. Si le drapeau associé à l'entrée en cours du tableau de données est mis (c'est-à-dire s'il correspond au dernier point compris dans le quadrilatère analysé), il faut incrementer l'index du tableau de données de luminances constitué pendant les tirs. Cet index pointe alors sur les luminances du quadrilatère suivant. Ces deux opérations forment le corps, très compact, du programme de calcul de l'image bitmap. On voit que, quel que soit le résultat de la deuxième opération liée à l'état du drapeau, le programme de calcul consomme exactement une entrée du tableau de données par parcours de la boucle. On peut donc prédire précisément l'instant où l'on aura besoin de données du tableau de données, et utiliser, si elle existe, l'instruction de préchargement dans la mémoire cache du processeur. Par exemple, dans le cas où ce processeur est un Pentium III™, et de l'exemple numérique cité ci- dessus, une ligne de mémoire cache représente 256 bits, et l'optimum est donc de réaliser une précharge (dite « prefetch ») de la mémoire cache tous les 8 points calculés.
Lorsque l'ensemble de la bitmap a été calculé, il faut noircir (ou blanchir, selon le choix de la couleur du fond d'image) le point supérieur gauche de la bitmap qui détient une information de luminance liée au dernier quadrilatère situé en zone visible, mais ne contenant lui-même aucun point de la bitmap.