Ouvrez les fichiers image (jpg), effectuez une analyse et passez à l'image suivanteJe suis très intéressé par l'utilisation de JMP pour effectuer un traitement et une analyse automatiques d'images et j'ai un script (fortement basé sur le complément John Pontes - et des informations recueillies sur son excellent blog). John Ponte, auteur du blog JMP ) que je peux exécuter sur une image à la fois sur des images, mais ce que je veux vraiment faire ensuite, c'est créer un script « en boucle » qui fait ce qui suit
- compte le nombre de fichiers .jpg dans un répertoire.
- un par un ouvre une image, place les informations disponibles (j'utilise le complément et le script de l'analyseur d'images John Pontes pour cela) dans une table de données
- effectue une analyse de base (moyenne des colonnes et des lignes, etc.)
- enregistre ceci avec le nom de fichier jpg
- ferme les fichiers et passe à l'image suivante.
J'ai un certain nombre de petits problèmes avec cela, mais les principaux sont lorsque j'utilise ce qui suit
Pour ( je = 1 , je <= N articles ( des dossiers ) , je ++,
Si ( Se termine par ( des dossiers [ je ] , ".jpg" ) ,
Ouvrir ( des dossiers [ je ] ) ;
);
l'ouvert (fichiers ); ouvre les fichiers jpg dans un autre programme (le programme par défaut que je ne veux pas modifier). Comment puis-je l'obtenir pour qu'il s'ouvre dans JMP en utilisant ce qui suit (ou autre chose si c'est mieux)
img = Nouvelle image ( "le nom du fichier.jpg" ) ;
w = Nouvelle fenetre ( "image" , img) ;
Je peux ensuite effectuer l'analyse, fermer tout cela et revenir en arrière jusqu'à ce que toutes les images aient été analysées.
[*Modifier le message original du membre du personnel Seligman. Deuxième partie de la question de l'utilisateur ajoutée ici au message original.]
Toutes mes excuses, je n'ai pas été assez clair dans mon message initial. Ce que je veux faire, c'est mettre les informations sur les pixels dans un tableau de données, pas dans l'image originale elle-même.
il s'agit en fait d'automatiser le ImageVersDatatable JSL script qui a déjà été écrit, mais parcourez chaque image dans un dossier et enregistrez le tableau de données résultant avec toute analyse résultante des pixels dans le même dossier.
les coordonnées x et y ainsi que les RVB, I et HSL me suffisent pour effectuer toute analyse dont j'ai besoin. J'ai joint un exemple de tableau de données sur lequel je peux effectuer une analyse, j'ai également joint l'image originale d'où ces données ont été extraites, j'en ai quelques milliers que je dois parcourir, donc les faire un par un serait presque impossible.
je m'excuse encore pour la mauvaise formulation et le manque de clarté du message d'origine.
Salutations
David
Re : Ouvrir les fichiers image (jpg), effectuer une analyse et passer à l'image suivanteConsolider deux réponses à ce message comme solution.
Partie 1 du personnel @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" );
);
);
Partie 2 du personnel @JohnPonte :
Une chose que je suggère est que vous pouvez utiliser NewImage() au lieu de Open() pour le fichier image. Open() est une fonction plus générale qui doit déterminer ce que vous ouvrez. Dans ce processus, il utilise les fonctionnalités du système d'exploitation, comme ouvrir votre image dans un autre programme. img = NouvelleImage("nomfichier.jpg"); ouvrira le fichier image et créera une image JSL, vous renvoyant le handle.
L'autre suggestion est que vous pouvez utiliser un autre script que j'ai créé (avant l'analyseur d'images) sur File Exchange, appelé ImageVersDatatable . Il convertira votre image en un tableau de données, de la même manière que l'analyseur d'images, mais vous n'obtiendrez pas tout le reste de ce que fait l'analyseur d'images.
Enroulez-le dans la boucle comme @Craige_Hales montre (ci-dessus) et vous devriez être prêt à partir.
Re : Ouvrir les fichiers image (jpg), effectuer une analyse et passer à l'image suivante<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je viens de tomber sur ce post et j'ai pensé ajouter quelques points, au cas où cela serait toujours utile.
Une chose que je suggère est que vous pouvez utiliser NewImage() au lieu de Open() pour le fichier image. Open() est une fonction plus générale qui doit déterminer ce que vous ouvrez. Dans ce processus, il utilise les fonctionnalités du système d'exploitation, comme ouvrir votre image dans un autre programme. img = NouvelleImage("nomfichier.jpg"); ouvrira le fichier image et créera une image JSL, vous renvoyant le handle.
L'autre suggestion est que vous pouvez utiliser un autre script que j'ai créé (avant l'analyseur d'images) sur File Exchange, appelé ImageVersDatatable . Il convertira votre image en un tableau de données, de la même manière que l'analyseur d'images, mais vous n'obtiendrez pas tout le reste de ce que fait l'analyseur d'images.
Enroulez-le dans la boucle comme Craige@JMP montre (ci-dessus) et vous devriez être prêt à partir.
Re : Ouvrir les fichiers image (jpg), effectuer une analyse et passer à l'image suivantepath = "$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 : Ouvrir les fichiers image (jpg), effectuer une analyse et passer à l'image suivanteToutes mes excuses, je n'ai pas été assez clair dans mon message initial. Ce que je veux faire, c'est mettre les informations sur les pixels dans un tableau de données, pas dans l'image originale elle-même.
il s'agit en fait d'automatiser le ImageVersDatatable JSL script qui a déjà été écrit, mais parcourez chaque image dans un dossier et enregistrez le tableau de données résultant avec toute analyse résultante des pixels dans le même dossier.
les coordonnées x et y ainsi que les RVB, I et HSL me suffisent pour effectuer toute analyse dont j'ai besoin. J'ai joint un exemple de tableau de données sur lequel je peux effectuer une analyse, j'ai également joint l'image originale d'où ces données ont été extraites, j'en ai quelques milliers que je dois parcourir, donc les faire un par un serait presque impossible.
je m'excuse encore pour la mauvaise formulation et le manque de clarté du message d'origine.
David.
Re : Ouvrir les fichiers image (jpg), effectuer une analyse et passer à l'image suivanteajoutez le paramètre de type de fichier.alors la valeur renvoyée sera un objet image.Cela fonctionnera probablement même si vous mélangez et faites correspondre PNG, JPG, GIF ; il indique à JMP de renvoyer l'image plutôt que de recourir au programme par défaut du système d'exploitation pour l'extension.
ouvert("$desktop/setFont.PNG","PNG")
Nouvelle image(
Char à Blob (
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
ou utilisez newimage pour obtenir l'objet image.
nouvelleimage("$desktop/setFont.PNG")
Nouvelle image(
Char à Blob (
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
newimage est plus simple ; open peut être nécessaire si l’image est une URL ou un Blob.
Re : Ouvrir les fichiers image (jpg), effectuer une analyse et passer à l'image suivanteCela devrait placer les fichiers image dans un dossier dans une table JMP :
// ian.cox@jmp.com :23 juin 2014
Noms par défaut ici ( 1 ) ;
dir = Choisir un répertoire ( "Choisissez un répertoire contenant des fichiers image :" ) ;
fListe = FichiersDansRépertoire ( dir ) ;
si ( NArticles ( fListe ) < 1 , Imprimer ( "Aucun fichier trouvé dans le dossier" || dir || "." ) ; Bip () ; Lancer ()) ;
dt = NouveauTableau ( "Images de" || dir ,
NouvelleColonne ( "Chemin du fichier" , Personnage , Nominal ) ,
NouvelleColonne ( "Image" , Expression ) , Ajouter des lignes ( NArticles ( fListe ))
) ;
pour ( F = 1 , F <= Articles ( fListe ) , F ++,
fp = dir || "/" || fListe [ F ] ;
Colonne ( dt , "Chemin du fichier" )[ F ] = fp ;
Essayer ( Colonne ( dt , "Image" )[ F ] = Nouvelle image ( fp )) ; // Utilisez 'Try()' au cas où ce ne serait pas un fichier image
) ;