Abrir archivos de imagen (jpg), realizar análisis y pasar a la siguiente imagenEstoy muy interesado en usar JMP para realizar el procesamiento y análisis automático de imágenes y tengo un script (basado en gran medida en el complemento de John Pontes) e información recopilada de su excelente blog. John Ponte, autor en JMP Blog ) que puedo ejecutar en una imagen a la vez en las 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 del analizador de imágenes John Pontes y el script 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 una serie de pequeños problemas con esto, pero los principales son que cuando uso lo siguiente
Para ( i = 1 , i <= N elementos ( 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 lo obtengo para que se abra en JMP usando lo siguiente (o algo más si es mejor)
imagen = Nueva imagen ( "elnombredelarchivo.jpg" ) ;
w = Nueva ventana ( "imagen" , imagen) ;
Luego puedo realizar el análisis y cerrar todo esto y volver atrás hasta que se hayan analizado todas las imágenes.
[*Editar a la publicación original del miembro del personal sseligman. 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 píxeles en una tabla de datos, no la imagen original en sí.
esto es, en efecto, automatizar el Imagen a tabla de datos JSL script que ya se ha escrito, pero revise cada imagen dentro de una carpeta y guarde 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 llevar a cabo cualquier análisis que requiera. 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, así 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 de un miembro del personal @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 de un miembro del personal @juanponte :
Una cosa que sugeriré es que puede usar NewImage(), en lugar de Open() para el archivo de imagen. Open() es una función más general que tiene que averiguar lo que está abriendo. En ese proceso, utiliza la funcionalidad del sistema operativo, como abrir su imagen en otro programa. img = NuevaImagen("nombrearchivo.jpg"); abrirá el archivo de imagen y creará una imagen JSL, devolviéndole el identificador.
La otra sugerencia es que puede usar otro script que hice (antes del Analizador de imágenes) en el Intercambio de archivos, llamado ImageToDatatable . 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.
Envuelve eso 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 puede usar NewImage(), en lugar de Open() para el archivo de imagen. Open() es una función más general que tiene que averiguar lo que está abriendo. En ese proceso, utiliza la funcionalidad del sistema operativo, como abrir su imagen en otro programa. img = NuevaImagen("nombrearchivo.jpg"); abrirá el archivo de imagen y creará una imagen JSL, devolviéndole el identificador.
La otra sugerencia es que puede usar otro script que hice (antes del Analizador de imágenes) en el Intercambio de archivos, llamado ImageToDatatable . 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.
Envuelve eso 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 píxeles en una tabla de datos, no la imagen original en sí.
esto es, en efecto, automatizar el Imagen a tabla de datos JSL script que ya se ha escrito, pero revise cada imagen dentro de una carpeta y guarde 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 llevar a cabo cualquier análisis que requiera. 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, así 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 mezcla y combina 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.
abierto("$escritorio/setFont.PNG","PNG")
Nueva imagen(
Char a blob(
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
o use newimage para obtener el objeto de imagen.
nueva imagen("$escritorio/setFont.PNG")
Nueva imagen(
Char a blob(
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
newimage es más simple; open podría ser necesario 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 poner los archivos de imagen en una carpeta en una tabla JMP:
// ian.cox@jmp.com :23jun2014
Nombres predeterminados hasta aquí ( 1 ) ;
directorio = Seleccionar directorio ( "Elija un directorio que contenga archivos de imagen:" ) ;
fLista = ArchivosEnDirectorio ( directorio ) ;
si ( Nartículos ( fLista ) < 1 , Impresión ( "No se encontraron archivos en la carpeta" || directorio || "." ) ; Bip () ; Lanzar ()) ;
dt = NuevaTabla ( "Imágenes de" || directorio ,
NuevaColumna ( "Ruta de archivo" , Personaje , Nominal ) ,
NuevaColumna ( "Imagen" , Expresión ) , Agregar filas ( Nartículos ( fLista ))
) ;
por ( F = 1 , F <= Nitems ( fLista ) , F ++,
fp = directorio || "/" || fLista [ F ] ;
Columna ( dt , "Ruta de archivo" )[ F ] = fp ;
Probar ( Columna ( dt , "Imagen" )[ F ] = Nueva imagen ( fp )) ; // Usa 'Try()' en caso de que no sea un archivo de imagen
) ;