Créer une fonction JMPCher tout le monde,
Mes connaissances en script JMP sont limitées et SAS ne me permet pas de faire ce que je peux faire dans JMP en termes de traitement d'image.
J'ai adapté un peu un script JMP existant ( JohnPonte ) qui me permettent de générer des données RVB à partir d'images.
le script me permet de le faire pour une image et j'ai plus de 300 images.
en SAS il m'est facile de créer une macro pour le faire de manière automatisée mais pas en JMP.
l'entrée (image) et la sortie (jeu de données SAS) auront le même nom ( en rouge ), cela signifie que la fonction n'aura qu'un seul argument.
les noms de toutes les images que je souhaite traiter sont stockés dans l'ensemble de données JMP (ensemble de données avec une colonne).
Voici le scénario :
NomsDefaultToHere(1);
// Lit l'image dans JMP
img = NouvelleImage("D:\ M1_ACTIVE_ZL_T00 .jpg");
w = nouvelleFenêtre("image", img);
// Récupère les valeurs des pixels sous forme de 3 matrices distinctes (rouge, vert et bleu)
// Les couleurs RVB sont dans un espace colorimétrique normalisé (0,0-1,0)
{r, g, b} = img << getPixels("rgb");
// Convertir RVB en matrice d'échelle de gris (intensité)
je = 0,3*r + 0,59*g + 0,11*b ;
// Obtenez les valeurs des pixels sous forme de couleurs JSL puis convertissez-les en teinte, luminosité et saturation
// Les couleurs HLS sont dans un espace colorimétrique normalisé (0,0-1,0)
jslColors = img << getPixels();
{h, l, s} = CouleurVersHLS(jslColors);
// Récupère les dimensions de l'image/des matrices
numRows = nrow(r);
numCols = ncol(r);
// Crée une table de données
dt = Nouveau tableau("Données d'image",
newColumn("X", définir les valeurs (repeat(1::numCols, numRows))),
newColumn("Y", définir les valeurs(shape(repeat(1::numRows,numCols)`,numCols,numRows))),
nouvelleColonne("r", définir les valeurs(r)),
nouvelleColonne("g", définir les valeurs(g)),
nouvelleColonne("b", définir les valeurs(b)),
nouvelleColonne("i", définir les valeurs(i)),
nouvelleColonne("h", définir les valeurs(h)),
nouvelleColonne("l", définir les valeurs(l)),
nouvelleColonne("s", définir des valeurs(s))
);
dt << Enregistrer("D:\ M1_ACTIVE_ZL_T00 .sas7bdat");
Fermer(dt);
img< w<
Merci d'avance pour notre aide.
très cordialement,
Samir
Re : Créer une fonction JMPJ'éviterais d'utiliser "j" comme variable car c'est aussi une fonction JSL. Essayez plutôt "k".
J. (nlignes, , )
Description : Crée une matrice de valeurs identiques.
Renvoie : La matrice.
Arguments:
nrows Nombre de lignes dans la matrice. Si ncols n'est pas spécifié, nrows est également utilisé comme ncols.
ncols Nombre de colonnes dans la matrice.
valeur La valeur utilisée pour remplir la matrice. Si la valeur n’est pas spécifiée, 1 est utilisé.
Re : Créer une fonction JMPJe suis heureux que vous ayez également détecté le problème de la variable "i".Ce qu'il faudrait probablement faire, c'est déclarer les variables de la fonction comme étant locales à la fonction.Cela résoudrait le problème sans avoir à changer les noms des variables
ImageProcessing = Function( {ImagePath},
{img,w,i,r,g,b,h,l,s,numRows,numCols,dt},
Re : Créer une fonction JMPMerci Jim,
Ça fonctionne maintenant 
Mais j'ai aussi remplacé i par j.
Je ne comprends pas pourquoi je ne travaille pas.
Passe une bonne journée,
Samir
Re : Créer une fonction JMPJe suppose que la raison pour laquelle il s'est arrêté après une seule image est que j'ai utilisé par erreur la variable "dt" pour pointer vers la table de données contenant les noms d'image, et à l'intérieur de la fonction, elle a également utilisé la variable "dt", qui a changé Sa valeur.Cela peut être facilement résolu soit en localisant la variable "dt" à l'intérieur de la fonction, soit en modifiant simplement la variable "dt" en dehors de la fonction.J'ai choisi cette dernière et dans l'exemple ci-dessous, je l'ai renommé "dtimage"
Names Default To Here( 1 );
// Read the image into JMP M1_ACTIVE_ZL_T00
ImageProcessing = Function( {ImagePath},
img = New Image( "D:\" || ImagePath || ".jpg" );
w = New Window( "image", img );
// Get the pixel values as 3 distinct matrices (red, green and blue)
// RGB colors are in normalized color space (0.0-1.0)
{r, g, b} = img << getPixels( "rgb" );
// Convert rgb to gray-scale (intensity) matrix
i = 0.3 * r + 0.59 * g + 0.11 * b;
// Get the pixel values as JSL colors then convert to hue, lightness and saturation
// HLS colors are in normalized color space (0.0-1.0)
jslColors = img << getPixels();
{h, l, s} = Color To HLS( jslColors );
// Get the dimensions of the image/matrices
numRows = N Row( r );
numCols = N Col( r );
// Create a data table
dt = New Table( "Image Data",
New Column( "X", set values( Repeat( 1 :: numCols, numRows ) ) ),
New Column( "Y", set values( Shape( Repeat( 1 :: numRows, numCols )`, numCols, numRows ) ) ),
New Column( "r", set values( r ) ),
New Column( "g", set values( g ) ),
New Column( "b", set values( b ) ),
New Column( "i", set values( i ) ),
New Column( "h", set values( h ) ),
New Column( "l", set values( l ) ),
New Column( "s", set values( s ) )
);
dt << Save( "D:\" || ImagePath || ".sas7bdat" );
Close( dt, nosave );
img << close Window();
w << close Window();
);
dtimage = Open( "path to data table with the one column with image names" );
// We will pretend that the column name is "TheImage"
For( i = 1, i <= N Rows( dtimage ), i++,
return = ImageProcessing( dtimage:TheImage[i] )
);Re : Créer une fonction JMPLui,
Oui, je vois cette fonction dans le complément de traitement d'image.
C'est utile.
Seigneur,
Samir
Re : Créer une fonction JMPSalut Craige,
Merci beaucoup pour votre réponse, je suis sûr que j'en aurai besoin dans les prochains jours.
Seigneur,
Samir
Re : Créer une fonction JMPCher Jim,
Merci beaucoup pour le code, c'est exactement ce que je veux.
Le seul problème est que la fonction n'exécute que la première ligne de ma table.
as-tu une idée pourquoi ?
Quand je dis "Petit", je parle de ma connaissance de JMP et non de JMP 
vMerci d'avance pour vos retours.
Samir
Re : Créer une fonction JMPUne pensée connexe - Si vous disposez d'un fichier multi-images (c'est-à-dire un GIF animé ou les piles TIF courantes en microscopie), JMP 13 (version Windows uniquement) les chargera directement comme un seul ensemble de données. Vous pourriez envisager de suivre cette voie et de regrouper vos images dans un fichier multi-images si vous disposez de données d'image séquentielles. Cela facilite également la maintenance de vos archives d’images.
M
Re : Créer une fonction JMPVoici quelques idées qui pourraient vous aider.
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "name",
Character,
"Nominal",
Set Selected,
Set Values( {"aaa", "bb", "cccc"} )
)
);
processFun = Function( {inputfile, outputfile},
{default local},
Show( inputfile, outputfile )
);
For( irow = 1, irow <= N Rows( dt ), irow++,
input = "c:/directory3/" || dt:name[irow] || ".jpg";
output = "c:/directory2/" || dt:name[irow] || ".png";
processFun( input, output );
);
/*:
inputfile = "c:/directory3/aaa.jpg";
outputfile = "c:/directory2/aaa.png";
inputfile = "c:/directory3/bb.jpg";
outputfile = "c:/directory2/bb.png";
inputfile = "c:/directory3/cccc.jpg";
outputfile = "c:/directory2/cccc.png";
L'exemple montre une fonction utilisateur "processFun" qui a deux arguments, une boucle lisant une table de données et des opérateurs de concaténation de chaînes pour créer les noms dont vous avez besoin.
Re : Créer une fonction JMPJ'admets que dans la portée relative de SAS par rapport à JMP, SAS est un système beaucoup plus grand, mais je ne peux pas être d'accord avec vous pour dire que JMP est petit.Voici votre script modifié très simplement pour faire ce que vous voulez.JMP n'a pas besoin d'avoir un langage de macro distinct comme le fait SAS, car le langage de JMP (JSL) intègre directement la génération de code, etc.
Voici le code que j'ai trouvé
Names Default To Here( 1 );
// Read the image into JMP M1_ACTIVE_ZL_T00
ImageProcessing = Function( {ImagePath},
img = New Image( "D:\" || ImagePath || ".jpg" );
w = New Window( "image", img );
// Get the pixel values as 3 distinct matrices (red, green and blue)
// RGB colors are in normalized color space (0.0-1.0)
{r, g, b} = img << getPixels( "rgb" );
// Convert rgb to gray-scale (intensity) matrix
i = 0.3 * r + 0.59 * g + 0.11 * b;
// Get the pixel values as JSL colors then convert to hue, lightness and saturation
// HLS colors are in normalized color space (0.0-1.0)
jslColors = img << getPixels();
{h, l, s} = Color To HLS( jslColors );
// Get the dimensions of the image/matrices
numRows = N Row( r );
numCols = N Col( r );
// Create a data table
dt = New Table( "Image Data",
New Column( "X", set values( Repeat( 1 :: numCols, numRows ) ) ),
New Column( "Y", set values( Shape( Repeat( 1 :: numRows, numCols )`, numCols, numRows ) ) ),
New Column( "r", set values( r ) ),
New Column( "g", set values( g ) ),
New Column( "b", set values( b ) ),
New Column( "i", set values( i ) ),
New Column( "h", set values( h ) ),
New Column( "l", set values( l ) ),
New Column( "s", set values( s ) )
);
dt << Save( "D:\" || ImagePath || ".sas7bdat" );
Close( dt, nosave );
img << close Window();
w << close Window();
);
dt = Open( "path to data table with the one column with image names" );
// We will pretend that the column name is "TheImage"
For( i = 1, i <= N Rows( dt ), i++,
return = ImageProcessing( dt:TheImage[i] )
);