Crear una función JMPQueridos todos,
Mi conocimiento en secuencias de comandos JMP es pequeño y SAS no me permite hacer lo que puedo hacer en JMP en términos de procesamiento de imágenes.
Adapté un poco un script JMP existente ( JuanPonte ) que me permiten generar datos RGB a partir de imágenes.
el script me permite hacerlo para una imagen y tengo más de 300 imágenes.
en SAS me resulta fácil crear una macro para hacerlo de forma automatizada pero en JMP no.
la entrada (imagen) y la salida (conjunto de datos SAS) tendrán el mismo nombre ( en rojo ), esto significa que la función tendrá un solo argumento.
Los nombres de todas las imágenes que quiero tratar se almacenan en el conjunto de datos JMP (conjunto de datos con una columna).
Aquí está el guión:
NombresDefaultToHere(1);
// Lee la imagen en JMP
img = NuevaImagen("D:\ M1_ACTIVE_ZL_T00 .jpg");
w = nuevaVentana("imagen", img);
// Obtener los valores de los píxeles como 3 matrices distintas (roja, verde y azul)
// Los colores RGB están en un espacio de color normalizado (0,0-1,0)
{r, g, b} = img << getPixels("rgb");
// Convertir rgb a matriz de escala de grises (intensidad)
yo = 0,3*r + 0,59*g + 0,11*b;
// Obtenga los valores de píxeles como colores JSL y luego conviértalos a tono, luminosidad y saturación
// Los colores HLS están en un espacio de color normalizado (0,0-1,0)
jslColors = img << getPixels();
{h, l, s} = ColorToHLS(jslColors);
// Obtener las dimensiones de la imagen/matrices
numRows = nrow(r);
numCols = ncol(r);
// Crea una tabla de datos
dt = Nueva tabla ("Datos de imagen",
nuevaColumna("X", establecer valores(repetir(1::numCols, numRows))),
newColumn("Y", establecer valores(forma(repetir(1::numRows,numCols)`,numCols,numRows))),
nuevaColumna("r", establecer valores(r)),
nuevaColumna("g", establecer valores(g)),
nuevaColumna("b", establecer valores(b)),
nuevaColumna("i", establecer valores(i)),
nuevaColumna("h", establecer valores(h)),
nuevaColumna("l", establecer valores(l)),
nuevaColumna("s", establecer valores)
);
dt << Guardar("D:\ M1_ACTIVE_ZL_T00 .sas7bdat");
Cerrar(dt);
img< w<
Gracias de antemano por nuestra ayuda.
saludos muy amables,
Samir
Re: Crear una función JMPEvitaría el uso de "j" como variable porque también es una función JSL. Pruebe con "k" en su lugar.
j (nrows, , )
Descripción: Crea una matriz de valores idénticos.
Devuelve: La matriz.
Argumentos:
filas Número de filas en la matriz. Si no se especifica ncols, nrows también se utiliza como ncols.
ncols Número de columnas en la matriz.
valor El valor utilizado para rellenar la matriz. Si no se especifica el valor, se utiliza 1.
Re: Crear una función JMPMe alegra que también hayas detectado el problema de la variable "i".Lo que realmente debería hacerse es declarar que las variables de la función sean locales de la función.Esto resolvería el problema sin tener que cambiar los nombres de las variables.
ImageProcessing = Function( {ImagePath},
{img,w,i,r,g,b,h,l,s,numRows,numCols,dt},
Re: Crear una función JMPGracias Jim,
Ahora funciona 
Pero también reemplacé i por j.
No entiendo por qué no trabajo.
Que tenga un lindo día,
Samir
Re: Crear una función JMPSupongo que la razón por la que se detuvo después de solo una imagen es que usé por error la variable "dt" para apuntar a la tabla de datos que tiene los nombres de las imágenes, y dentro de la función, también usó la variable "dt", que cambió. es valioso.Esto se puede resolver fácilmente localizando la variable "dt" dentro de la función o simplemente cambiando la variable "dt" fuera de la función.Elegí este último y, en el siguiente ejemplo, le cambié el nombre a "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: Crear una función JMPA él,
Sí, veo esta función en el complemento de procesamiento de imágenes.
Es útil.
krs,
Samir
Re: Crear una función JMPHola Craige,
Muchas gracias por tu respuesta. Estoy seguro de que lo necesitaré en los próximos días.
krs,
Samir
Re: Crear una función JMPQuerido Jim,
Muchas gracias por el código, es exactamente lo que quiero.
El único problema es que la función ejecuta solo la primera fila de mi tabla.
¿Tienes una idea de por qué?
Cuando digo "Pequeño", hablo de mi conocimiento de JMP, no de JMP 
Gracias de antemano por sus comentarios.
Samir
Re: Crear una función JMPUna idea relacionada: si tiene un archivo de varias imágenes (es decir, un GIF animado o pilas TIF que son comunes en microscopía), JMP 13 (solo versión de Windows) los cargará directamente como un conjunto de datos. Podría considerar tomar esta ruta y empaquetar sus imágenes en un archivo de varias imágenes si tiene datos de imágenes secuenciales. También facilita el mantenimiento de sus archivos de imágenes.
METRO
Re: Crear una función JMPA continuación se ofrecen algunas ideas que podrían ayudar.
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";
El ejemplo muestra una función de usuario "processFun" que tiene dos argumentos, muestra un bucle que lee una tabla de datos y muestra algunos operadores de concatenación de cadenas para crear los nombres que necesita.
Re: Crear una función JMPAdmito que, en el ámbito relativo de SAS frente a JMP, SAS es un sistema mucho más grande, pero no puedo estar de acuerdo con usted en que JMP sea pequeño.Aquí está su script modificado de manera muy simple que debería hacer lo que desea.JMP no tiene que tener un lenguaje de macros separado como lo tiene SAS, porque el lenguaje de JMP (JSL) tiene la generación de código, etc., integrada directamente en él.
Aquí está el código que se me ocurrió
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] )
);