[Dcmlib] gdcm proposal

Benoit Regrain benoit.regrain at creatis.insa-lyon.fr
Wed Apr 27 11:02:01 CEST 2005


Hi,

Attention, le mail est long ;-p


----- Original Message ----- 
From: "Mathieu Malaterre" <mathieu.malaterre at kitware.com>
To: "Mailing list gdcm" <dcmlib at creatis.insa-lyon.fr>
Sent: Tuesday, April 26, 2005 4:21 PM
Subject: [Dcmlib] gdcm proposal


>     Sinon dans les commentaires en vrac, je continue a donner un role
> different a /l'image DICOM/. Pour moi on peut parfaitement avoir un
> header avec PixelSize=12, Spacing=0,0 et pourtant l'image gdcm.Image
> doit etre construite correctement. Ainsi on peut faire PrintDocument et
> montrer les valeurs effectivement lues, et aussi bien plus tard sauver
> l'image correctement. L'idee serait que gdcm.Writer ecrive un
> dictionaire dont les valeurs se baserait sur gdcm.Image (et ecraserait
> celle de l'input). Je fais reference a l'horeur qui est faite en ce
> moment dans gdcm, si une image est codee sur 12 bits juste avant de
> l'ecrire on change 12 -> 16 ... ce qui veut dire que PrintDocument est
> dependant de l'ordre des actions au moment de l'ecriture.

Dans le gdcm::FileHelper, les choses sont faites proprement, ce qui veut
dire que le Document d'origine n'est pas modifié. Il semble par contre
que le gdcm::File fasse des 'saloperies' que je n'avais pas vues...
Ca serait en effet a corriger pour la version courante de gdcm.
Par contre je n'ai pas compris : tu veux que ton gdcm.Writer modifie
définitivement le gdcm.Document passé en entrée ? ou que la modification
soit juste temporaire (le temps de l'écriture du fichier) ?





>     J'ai essayer d'avoir un reader/writer ala VTK, mais c'est aussi base
> sur le principe de ifstream/ofstream. Je fais donc le choix de dupliquer
> le header DICOM... ou alors il faudrait faire un Writer astucieux qui au
> moment d'ecrire valeur par valeur verifierais qu'il n'ecrive pas une 
> betise.

Ca me plait beaucoup ca. Ce n'etait pas possible il y a plus de 6 mois dû
à la complexité interne de gdcm. J'y avais déjà pensé, mais c'était 
infaisable.
La dessus, je suis 100% d'accord.


--------------------------------------------------------------------------
Maintenant voici mes remarques :
 - le File (dérivé du Document) fait déjà une bonne partie de ce que tu
veux faire. Je pense qu'en effet, il est bien de garder cette structure qui
convient parfaitement.

 - le DicomDir (dérivé de Document), tu n'en parles pas. Etant donné
qu'il n'a pas besoin de la complexité interne du Document, garde-t-on
cette dérivation ? (elle est à l'heure actuelle utile car le Document 
contient
toute la partie Reader/Writer, mais je pense qu'on peut s'en abstraire
pour la structure que tu proposes).

 - Dans la création d'un Element du Document... comment on
différencie les ValEntry, BinEntry et SeqEntry ? A l'heure actuelle,
on fait cette différenciation à la création de l'élément en fonction de son 
VR.
De plus, un Element (ou DocEntry à l'heure actuelle) est rataché à un 
DictEntry.
Tu fais ce rattachement à quel moment ? De plus lorsque le dictionnaire 
publique
ne contient pas le tuple (group, element, VR) il en crée un nouveau 
sauvegardé
dans une zone tampon... garde-t-on cela qui n'est pas tres propre ? ou 
place-t-on
le VR de l'Element dans l'Element ? Ce qui nous donnerait :

newel = gdcm.Element("OB")    // La VR est affecté au moment de la création 
de l'objet
newel.Set(0x1234,0x5678)       // On va rechercher le DictEntry 
correspondant... mais dans quel Dict ?
newel.SetValue("foobar")          // Et pour une valeur binaire ou une 
séquence, que fait-on ?

Mais ceci ne résoudrait pas le problème de création de l'élément en fonction 
de sa VR.
Car avec ce choix, l'utilisateur peut créer un Element de VR "SQ" et mettre 
des données
textuelles dedans. Une solution serait de mettre le constructeur en 
protected
et d'avoir un New avec une création de l'objet en fonction de la VR...

 - Concernant l'écriture des series, tu considères avoir en entrée une liste 
de Document
ou un seul Document contenant une image 3D ? Pour moi, la liste de Document
et nettement plus adaptée car d'un Document à l'autre, de nombreux champs de
l'entete peuvent varier.

 - Une question qui ne peut se déduire du code python : la création des 
objets
se ferait par quelle méthode ? une méthode New comme en VTK, ou un new
habituel comme on fait actuellement ?

 - Concernant les Series, tu fais un SerieReader... qui remplacerait 
surement
le SerieHelper actuel... je ne suis pas sur qu'il s'agisse d'une bonne 
solution
(d'après ce que j'ai compris de l'intérêt du SerieHelper). Le SerieHelper a 
pour
but d'ordonner les différents fichiers d'une meme série. Or l'utilisateur 
pourrait
très bien vouloir lire ses différents fichiers d'une part, puis les trier... 
or s'il passe
dans un SerieReader, il va de nouveau relire ces fichiers. Il serait mieux 
d'avoir
un SerieOrder qui prend en entrée une liste de Document (donc les fichiers 
sont
déjà lus) et ce process ne ferai qu'ordonner cette liste (suivant les 
critères actuels
du SerieHelper).

 - Pour la classe Image, je n'ai pas très bien compris comment elle 
fonctionne.
A-t-elle une sortie ? et quel type de sortie ? ... simplement un tableau de 
données comme
le fait le FileHelper actuel lorsque tu appelle la méthode GetImage ?
Et lorsque l'utilisateur demande un sous-volume englobant le volume 
précédement lu,
réutilise-t-on le volume précédemment lu ?

image = gdcm.Image()
image.SetInput( reader.GetOutput())
image.SetSubVolume(512,512,1,3)  # SetVOI / SetExtent
image.Construct()
image.SetSubVolume(512,512,0,10)  # SetVOI / SetExtent englobant le VOI 
precedent.
image.Construct()

 - Pour l'ecriture des images créées from scratch. Comment cela se 
passerait-il ?
Tu as dit que l'Image replacerait les champs du Document, ce qui veut dire 
qu'il
faut passer à la fois une Image et un Document au Writer ? Sur ce point, je 
crois qu'il
manque un exemple d'utilisation. J'ai aussi beaucoup de mal à voir ce que tu 
appelles
Image...

--------------------------------------------------------------------------

Voila, les remarques sont finies. Certaines rentrent déjà dans 
l'implémentation, j'espere
donc que je ne les pose pas trop tot. Je crois sinon que j'ai fait le tour 
du sujet.
Sinon, moi aussi je ne vais pas avoir beaucoup de temps à investir dans le 
développement
de cette nouvelle mouture de gdcm... mais ce sera un problème à voir 
lorsqu'on aura
défini la structure finale de gdcm !
Je pense que cette fois ci, il ne faut pas commencer à développer avant 
d'avoir la structure
finale de la librairie et d'avoir vérifié que les exemples créés conviennent 
à tout ce
dont on a besoin.

Désolé pour la longueur du mail. J'ai essayé d'etre le plus constructif 
possible, et
ca prend de la place. J'espere que vous serez arrivé jusqu'ici

Benoit

PS : Mathieu, tes exemples sont une très bonne idée. Je pense qu'il faut 
continuer à les
faire et les compléter au fur et à mesure... afin d'avoir l'utilisation 
complète et finale
de la librairie.




More information about the Dcmlib mailing list