Abra archivos de imagen (jpg), realice análisis y pase a la siguiente imagenEstoy muy interesado en usar JMP para realizar análisis y procesamiento automático de imágenes y tengo un script (basado en gran medida en el complemento John Pontes, e información recopilada de su excelente blog). John Ponte, autor del blog JMP ) que puedo ejecutar en una imagen a la vez en imágenes, pero lo que realmente quiero hacer a continuación es crear un script de 'bucle' que haga lo siguiente
- cuenta el número de archivos .jpg en un directorio.
- uno por uno abre una imagen, coloca la información disponible (estoy usando el complemento y el script del analizador de imágenes de John Pontes para esto) en una tabla de datos
- hace un análisis básico (media de columnas y filas, etc.)
- guarda esto con el nombre de archivo jpg
- cierra los archivos y pasa a la siguiente imagen.
Tengo varios pequeños problemas con esto, pero los principales son que cuando uso lo siguiente
Para ( i = 1 , i <= N artículos ( archivos ) , i ++,
Si ( Termina con ( archivos [ i ] , ".jpg" ) ,
Abierto ( archivos [ i ] ) ;
);
los archivos abiertos ( ); abre los archivos jpg en otro programa (el programa predeterminado que no quiero cambiar). ¿Cómo consigo que se abra en JMP usando lo siguiente (o algo más si es mejor)?
imagen = Nueva imagen ( "el nombre de archivo del.jpg" ) ;
w = Nueva ventana ( "imagen" , imagen) ;
Luego puedo realizar el análisis y cerrar todo esto y volver a realizar el ciclo hasta que se hayan analizado todas las imágenes.
[*Editado en la publicación original por el miembro del personal sselliman. Segunda parte de la pregunta del usuario agregada aquí a la publicación original.]
Muchas disculpas, no fui lo suficientemente claro en mi publicación original. Lo que quiero hacer es poner la información de los píxeles en una tabla de datos, no la imagen original en sí.
esto es, en efecto, automatizar el ImageToDatatableJSL script que ya se ha escrito, pero revisa cada imagen dentro de una carpeta y guarda la tabla de datos resultante con cualquier análisis resultante de los píxeles en la misma carpeta.
las coordenadas x e y junto con RGB, I y HSL son suficientes para realizar cualquier análisis que necesite. Adjunté una tabla de datos de ejemplo en la que puedo realizar análisis, también adjunté la imagen original de donde se tomaron estos datos, tengo algunos miles de estos que necesito revisar, por lo que hacerlo uno a la vez sería Casi imposible.
Disculpas nuevamente por la mala redacción y la falta de claridad en la publicación original.
Saludos
David
Re: Abrir archivos de imagen (jpg), realizar análisis y pasar a la siguiente imagenConsolidando dos respuestas a esta publicación como la solución.
Parte 1 del empleado @Craige_Hales :
path = "$desktop/temp/";
files = Files In Directory( path );
For( ifile = 1, ifile <= N Items( files ), ifile++,
filename = files[ifile];
If( Right( filename, 4 ) == ".jpg",
pic = Open( path || filename, "jpg" );
jslcolor = pic << getpixels();
{red, green, blue} = Color To RGB( jslcolor );
{hue, lightness, saturation} = Color To HLS( jslcolor );
nr = N Rows( jslcolor );
nc = N Cols( jslcolor );
dt = New Table( Substr( filename, 1, Length( filename ) - 4 ),
addrows( nr * nc ),
New Column( "x" ),
New Column( "y" ),
New Column( "red", setvalues( red ) ),
New Column( "green", setvalues( green ) ),
New Column( "blue", setvalues( blue ) ),
New Column( "hue", setvalues( hue ) ),
New Column( "lightness", setvalues( lightness ) ),
New Column( "saturation", setvalues( saturation ) ),
);
irow = 0;
For( iy = 1, iy <= nr, iy++,
For( ix = 1, ix <= nc, ix++,
irow++;
dt:y[irow] = iy;
dt:x[irow] = ix;
)
);
// do something with dt
Wait( 1 );
Close( dt, "nosave" );
);
);
Parte 2 del empleado @JohnPonte :
Una cosa que sugeriré es que puedes usar NewImage(), en lugar de Open() para el archivo de imagen. Open() es una función más general que tiene que descubrir qué estás abriendo. En ese proceso, utiliza la funcionalidad del sistema operativo, como abrir su imagen en otro programa. img = NuevaImagen("nombre de archivo.jpg"); abrirá el archivo de imagen y creará una imagen JSL, devolviéndole el identificador.
La otra sugerencia es que puedes usar otro script que hice (antes de Image Analyzer) en File Exchange, llamado Imagen a tabla de datos . Convertirá su imagen en una tabla de datos, de manera similar al Analizador de imágenes, pero no obtendrá todo el resto de lo que hace el Analizador de imágenes.
Envuélvalo en el bucle como @Craige_Hales muestra (arriba) y debería estar listo para comenzar.
Re: Abrir archivos de imagen (jpg), realizar análisis y pasar a la siguiente imagen<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Acabo de encontrar esta publicación y pensé en agregar un par de puntos, en caso de que aún sea útil.
Una cosa que sugeriré es que puedes usar NewImage(), en lugar de Open() para el archivo de imagen. Open() es una función más general que tiene que descubrir qué estás abriendo. En ese proceso, utiliza la funcionalidad del sistema operativo, como abrir su imagen en otro programa. img = NuevaImagen("nombre de archivo.jpg"); abrirá el archivo de imagen y creará una imagen JSL, devolviéndole el identificador.
La otra sugerencia es que puedes usar otro script que hice (antes de Image Analyzer) en File Exchange, llamado Imagen a tabla de datos . Convertirá su imagen en una tabla de datos, de manera similar al Analizador de imágenes, pero no obtendrá todo el resto de lo que hace el Analizador de imágenes.
Envuélvalo en el bucle como Craige@JMP muestra (arriba) y debería estar listo para comenzar.
Re: Abrir archivos de imagen (jpg), realizar análisis y pasar a la siguiente imagenpath = "$desktop/temp/";files = Files In Directory( path );For( ifile = 1, ifile <= N Items( files ), ifile++, filename = files[ifile]; If( Right( filename, 4 ) == ".jpg", pic = Open( path || filename, "jpg" ); jslcolor = pic << getpixels(); {red, green, blue} = Color To RGB( jslcolor ); {hue, lightness, saturation} = Color To HLS( jslcolor ); nr = N Rows( jslcolor ); nc = N Cols( jslcolor ); dt = New Table( Substr( filename, 1, Length( filename ) - 4 ), addrows( nr * nc ), New Column( "x" ), New Column( "y" ), New Column( "red", setvalues( red ) ), New Column( "green", setvalues( green ) ), New Column( "blue", setvalues( blue ) ), New Column( "hue", setvalues( hue ) ), New Column( "lightness", setvalues( lightness ) ), New Column( "saturation", setvalues( saturation ) ), ); irow = 0; For( iy = 1, iy <= nr, iy++, For( ix = 1, ix <= nc, ix++, irow++; dt:y[irow] = iy; dt:x[irow] = ix; ) ); // do something with dt Wait( 1 ); Close( dt, "nosave" ); ););Re: Abrir archivos de imagen (jpg), realizar análisis y pasar a la siguiente imagenMuchas disculpas, no fui lo suficientemente claro en mi publicación original. Lo que quiero hacer es poner la información de los píxeles en una tabla de datos, no la imagen original en sí.
esto es, en efecto, automatizar el ImageToDatatableJSL script que ya se ha escrito, pero revisa cada imagen dentro de una carpeta y guarda la tabla de datos resultante con cualquier análisis resultante de los píxeles en la misma carpeta.
las coordenadas x e y junto con RGB, I y HSL son suficientes para realizar cualquier análisis que necesite. Adjunté una tabla de datos de ejemplo en la que puedo realizar análisis, también adjunté la imagen original de donde se tomaron estos datos, tengo algunos miles de estos que necesito revisar, por lo que hacerlo uno a la vez sería Casi imposible.
Disculpas nuevamente por la mala redacción y la falta de claridad en la publicación original.
David.
Re: Abrir archivos de imagen (jpg), realizar análisis y pasar a la siguiente imagenagregue el parámetro de tipo de archivo.entonces el valor devuelto será un objeto de imagen.Probablemente funcionará incluso si mezclas y combinas PNG, JPG, GIF; le dice a JMP que devuelva la imagen en lugar de recurrir al programa predeterminado del sistema operativo para la extensión.
abrir("$escritorio/setFont.PNG","PNG")
Nueva imagen(
Char a Blob(
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
o use newimage para obtener el objeto de imagen.
nuevaimagen("$escritorio/setFont.PNG")
Nueva imagen(
Char a Blob(
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
nueva imagen es más simple; Es posible que sea necesario abrir si la imagen es una URL o un Blob.
Re: Abrir archivos de imagen (jpg), realizar análisis y pasar a la siguiente imagenEsto debería colocar los archivos de imagen en una carpeta en una tabla JMP:
// ian.cox@jmp.com :23 de junio de 2014
Nombres predeterminados aquí ( 1 ) ;
directorio = Seleccionar directorio ( "Elija un directorio que contenga archivos de imagen:" ) ;
fLista = Archivos en el directorio ( directorio ) ;
si ( NArtículos ( fLista ) < 1 , Imprimir ( "No se encontraron archivos en la carpeta" || directorio || "." ) ; Bip () ; Tirar ()) ;
dt = Nueva tabla ( "Imágenes de" || directorio ,
Nueva columna ( "Ruta de archivo" , Personaje , Nominal ) ,
Nueva columna ( "Imagen" , Expresión ) , Agregar filas ( NArtículos ( fLista ))
) ;
para ( F = 1 , F <= Nitems ( fLista ) , F ++,
fp = directorio || "/" || fLista [ F ] ;
Columna ( dt , "Ruta de archivo" )[ F ] = fp ;
Intentar ( Columna ( dt , "Imagen" )[ F ] = Nueva imagen ( fp )) ; // Usa 'Try()' en caso de que no sea un archivo de imagen
) ;