Salut à tous,
Je débute ce topic en introduisant que je ne suis pas programmeur ni même informaticien, que je maitrise assez bien MatLab, mais que l'objectiv-C est encore assez obscure pour moi.
Je travaille dans le domaine de l'imagerie médicale et je souhaiterai développer un plugin pour le logiciel gratuit Osirix. Il ne fonctionne que sur Mac, du coup je programme sous Xcode en objectiv-C.
L'object de mon travail est d'arriver à programmer un plugin capable de travailler sur des images en 4 dimensions. Globalement, tous les outils d'affichage sont déja inclus dans Osirix, il ne me "reste" donc plus qu'à apprendre à gérer les données dynamiques, ce que je fais depuis longtemps sur MatLab.
Osirix est relativement bien fait puisqu'il propose un générateur de plugin, qui crée les fichier .h et .m, je n'ai plus qu'a écrire le coeur du code.
Pour commencer, je souhaiterai, à partir de données 4D de la forme imageDyn(x,y,z,t) créer des fonctions simples du type [intégrale des valeurs] et retourner une image paramétrique imageParam(x,y,z)
Voici ce que je suis arrivé à programmer en prenant des bouts de code par ci par là. Ma fonction computeADC, appelée par le bouton du même nom me permet d'appliquer un seuillage à la valeur de signal 128.
Au dessus de cette valeur, l'image reste la même.
Le processus s'applique à tous les images.
Voilà, j'espère vous avoir donné assez d'explications et que vous pourrez me donner un petit coup de main.
A bientôt
Alex
Je débute ce topic en introduisant que je ne suis pas programmeur ni même informaticien, que je maitrise assez bien MatLab, mais que l'objectiv-C est encore assez obscure pour moi.
Je travaille dans le domaine de l'imagerie médicale et je souhaiterai développer un plugin pour le logiciel gratuit Osirix. Il ne fonctionne que sur Mac, du coup je programme sous Xcode en objectiv-C.
L'object de mon travail est d'arriver à programmer un plugin capable de travailler sur des images en 4 dimensions. Globalement, tous les outils d'affichage sont déja inclus dans Osirix, il ne me "reste" donc plus qu'à apprendre à gérer les données dynamiques, ce que je fais depuis longtemps sur MatLab.
Osirix est relativement bien fait puisqu'il propose un générateur de plugin, qui crée les fichier .h et .m, je n'ai plus qu'a écrire le coeur du code.
Pour commencer, je souhaiterai, à partir de données 4D de la forme imageDyn(x,y,z,t) créer des fonctions simples du type [intégrale des valeurs] et retourner une image paramétrique imageParam(x,y,z)
Bloc de code:
//
// TopCaoFilter.m
// TopCao
//
// Copyright (c) 2010 Alexandre. All rights reserved.
//
#import "TopCaoFilter.h"
@implementation TopCaoFilter
- (void) initPlugin
{
}
- (long) filterImage:(NSString*) menuName
{
NSWindowController *window = [[NSWindowController alloc] initWithWindowNibName:@"Control_Panel" owner:self];
[window showWindow:self]; // This will bring up the window
return 0; // No errors
}
// COMPUTE ADC
- (IBAction) computeADC:(id)sender;
{
NSLog(@"computeADC!!!");
id waitWindow = [viewerController startWaitWindow:@"Computing ADC !"];
// New window
ViewerController *new2DViewer;
// Duplicate the current window
new2DViewer = [self duplicateCurrent2DViewerWindow];
NSString* message ; // Declare message for window
int i, x, zSize; // Declare variables
float *fImage, *fImageNew; // Declare images
NSArray *pixList, *pixListNew; // 4D
DCMPix *curPix, *curPixNew; // 2D
pixList = [viewerController pixList];
pixListNew = [new2DViewer pixList];
zSize = [pixList count];
message = @"zSize"; //@"Define this message in the Hello World plugin's preferences";
for (i = 0; i < zSize; i++)
{
curPix = [pixList objectAtIndex:i];
curPixNew = [pixListNew objectAtIndex:i];
// fImage is a pointer on the pixels, ALWAYS represented in float
fImage = [curPix fImage];
fImageNew = [curPixNew fImage];
x = [curPixNew pheight] * [curPixNew pwidth];
while (x-- > 0) {
if (*fImage < 128) {
*fImageNew = 0;
}
else{
*fImageNew = *fImage;
}
fImage++;
fImageNew++;
}
}
[viewerController endWaitWindow: waitWindow];
// Apply clut & full dynamic range & refresh window
[new2DViewer ApplyCLUTString: @"Rainbow"];
[[new2DViewer imageView] setWLWW:0 :0];
[new2DViewer needsDisplayUpdate];
NSAlert *myAlert = [NSAlert alertWithMessageText:@"Control value text box"
defaultButton:@"OK"
alternateButton:nil
otherButton:nil
informativeTextWithFormat:@"%@", message];
[myAlert runModal];
}
- (IBAction) closePlugin:(id)sender;
{
[myWindow close];
}
@end
Au dessus de cette valeur, l'image reste la même.
Le processus s'applique à tous les images.
Voilà, j'espère vous avoir donné assez d'explications et que vous pourrez me donner un petit coup de main.
A bientôt
Alex