Creare una funzione JMPCari tutti,
La mia conoscenza dello scripting JMP è scarsa e SAS non mi consente di fare ciò che posso fare in JMP in termini di elaborazione delle immagini.
Ho adattato leggermente uno script JMP esistente ( Giovanni Ponte ) che mi permettono di generare dati RGB dalle immagini.
lo script mi permette di farlo per un'immagine e ho più di 300 immagini.
in SAS è facile per me creare una macro per farlo in modo automatizzato ma non in JMP.
l'input (immagine) e l'output (set di dati SAS) avranno lo stesso nome ( in rosso ), ciò significa che la funzione avrà un solo argomento.
i nomi di tutte le immagini che voglio trattare sono memorizzati nel dataset JMP (dataset con una colonna).
Ecco la sceneggiatura:
NomiDefaultToHere(1);
// Legge l'immagine in JMP
img = NuovaImmagine("D:\ M1_ACTIVE_ZL_T00 .jpg");
w = newWindow("immagine", img);
// Ottieni i valori dei pixel come 3 matrici distinte (rosso, verde e blu)
// I colori RGB sono nello spazio colore normalizzato (0.0-1.0)
{r, g, b} = img << getPixels("rgb");
// Converte l'rgb in una matrice in scala di grigi (intensità).
i = 0,3*r + 0,59*g + 0,11*b;
// Ottieni i valori dei pixel come colori JSL, quindi convertili in tonalità, luminosità e saturazione
// I colori HLS sono nello spazio colore normalizzato (0,0-1,0)
jslColors = img << getPixels();
{h, l, s} = ColorToHLS(jslColors);
// Ottiene le dimensioni dell'immagine/matrici
numRighe = nriga(r);
numCols = ncol(r);
// Crea una tabella di dati
dt = Nuova tabella ("Dati immagine",
newColumn("X", imposta valori(ripeti(1::numCols, numRighe))),
newColumn("Y", imposta valori(shape(repeat(1::numRighe,numCols)`,numCols,numRighe))),
nuovaColonna("r", imposta valori(r)),
nuovaColonna("g", imposta valori(g)),
nuovaColonna("b", imposta valori(b)),
newColumn("i", imposta valori(i)),
nuovaColonna("h", imposta valori(h)),
nuovaColonna("l", imposta valori(l)),
newColumn("s", imposta valori)
);
dt < M1_ACTIVE_ZL_T00 .sas7bdat");
Chiudi(dt);
img< w<
Grazie in anticipo per il nostro aiuto.
saluti molto cordiali,
Samir
Ri: Creare una funzione JMPEviterei l'uso di "j" come variabile perché è anche una funzione JSL. Prova invece "k".
J (nrows, , )
Descrizione: crea una matrice di valori identici.
Restituisce: la matrice.
Argomenti:
nrows Numero di righe nella matrice. Se ncols non è specificato, anche nrows viene utilizzato come ncols.
ncols Numero di colonne nella matrice.
valore Il valore utilizzato per popolare la matrice. Se il valore non è specificato, viene utilizzato 1.
Ri: Creare una funzione JMPSono felice che tu abbia colto anche il problema della variabile "i".Ciò che probabilmente dovrebbe essere fatto è dichiarare che le variabili nella funzione sono locali alla funzione.Ciò risolverebbe il problema senza dover modificare i nomi delle variabili
ImageProcessing = Function( {ImagePath},
{img,w,i,r,g,b,h,l,s,numRows,numCols,dt},
Ri: Creare una funzione JMPGrazie Jim,
Ora funziona 
Ma ho sostituito anche i con j.
Non capisco perché non funziona.
Buona giornata,
Samir
Ri: Creare una funzione JMPPresumo che il motivo per cui si è fermato dopo una sola immagine è che ho erroneamente utilizzato la variabile "dt" per puntare alla tabella dati che contiene i nomi delle immagini e, all'interno della funzione, ha utilizzato anche la variabile "dt", che è cambiata è valore.Questo può essere facilmente risolto localizzando la variabile "dt" all'interno della funzione o semplicemente modificando la variabile "dt" all'esterno della funzione.Ho scelto quest'ultimo e nell'esempio qui sotto l'ho rinominato in "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] )
);Ri: Creare una funzione JMPLui,
Sì, vedo questa funzione nel componente aggiuntivo per l'elaborazione delle immagini.
È utile.
Krs,
Samir
Ri: Creare una funzione JMPCiao Craige,
Grazie mille per la risposta, sono sicuro che ne avrò bisogno nei prossimi giorni.
Krs,
Samir
Ri: Creare una funzione JMPCaro Jim,
Grazie mille per il codice, è esattamente quello che voglio.
L'unico problema è che la funzione esegue solo la prima riga della mia tabella.
hai un'idea del perché?
Quando dico "Piccolo", parlo della mia conoscenza di JMP, non di JMP 
vGrazie in anticipo per i vostri feedback.
Samir
Ri: Creare una funzione JMPUn pensiero correlato: se si dispone di un file con più immagini (ad esempio una GIF animata o gli stack TIF comuni nella microscopia), JMP 13 (solo versione Windows) li caricherà direttamente come un unico set di dati. Potresti prendere in considerazione questa strada e impacchettare le tue immagini in un file multi-immagine se disponi di dati di immagine sequenziali. Inoltre semplifica la gestione degli archivi di immagini.
M
Ri: Creare una funzione JMPEcco alcune idee che potrebbero aiutare.
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'esempio mostra una funzione utente "processFun" che ha due argomenti e mostra un ciclo che legge una tabella di dati e mostra alcuni operatori di concatenazione di stringhe per creare i nomi necessari.
Ri: Creare una funzione JMPDevo ammettere che nell'ambito relitive di SAS rispetto a JMP, SAS è un sistema molto più grande, ma non posso essere d'accordo con te sul fatto che JMP sia piccolo.Ecco il tuo script modificato in modo molto semplice per fare quello che vuoi.JMP non deve avere un linguaggio macro separato come fa SAS, perché il linguaggio di JMP (JSL) ha la generazione del codice, ecc. incorporata direttamente al suo interno.
Ecco il codice che ho inventato
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] )
);