Bilddateien (jpg) öffnen, Analyse durchführen und zum nächsten Bild übergehenIch bin sehr daran interessiert, JMP für die automatische Bildverarbeitung und -analyse zu verwenden, und ich habe ein Skript (das stark auf dem Add-In von John Pontes basiert - und Informationen aus seinem hervorragenden Blog John Ponte, Autor im JMP-Blog ), dass ich ein Bild nach dem anderen auf Bildern ausführen kann, aber was ich als nächstes wirklich tun möchte, ist, ein "Schleifen" -Skript zu erstellen, das Folgendes tut
- zählt die Anzahl der .jpg-Dateien in einem Verzeichnis.
- one-by-one öffnet ein Bild und fügt die verfügbaren Informationen (ich verwende dafür das John Pontes Image Analyzer Add-In und Skript) in eine Datentabelle ein
- führt eine grundlegende Analyse durch (Mittelwert von Spalten und Zeilen usw.)
- speichert diese mit dem jpg-Dateinamen
- schließt die Dateien und wechselt zum nächsten Bild.
Ich habe eine Reihe kleiner Probleme damit, aber die Hauptprobleme sind, wenn ich Folgendes verwende
Zum ( ich = 1 , ich <= N Artikel ( Dateien ) , ich ++,
Wenn ( Endet mit ( Dateien [ ich ] , ".jpg" ) ,
Offen ( Dateien [ ich ] ) ;
);
Die geöffneten (Dateien ); öffnet die jpg-Dateien in einem anderen Programm (das Standardprogramm, das ich nicht ändern möchte). Wie bekomme ich es so, dass es in JMP geöffnet wird, indem ich Folgendes verwende (oder etwas anderes, wenn es besser ist)
Bild = Neues Bild ( "derdateinameder.jpg" ) ;
w = Neues Fenster ( "Bild" , Bild) ;
Ich kann dann die Analyse durchführen und alles schließen und wieder herumlaufen, bis alle Bilder analysiert wurden.
[*Bearbeitung des ursprünglichen Beitrags von Mitarbeiter seligman. Zweiter Teil der Benutzerfrage hier zum ursprünglichen Beitrag hinzugefügt.]
Viele Entschuldigungen, ich war nicht klar genug in meinem ursprünglichen Beitrag. Ich möchte die Pixelinformationen in eine Datentabelle einfügen, nicht das Originalbild selbst.
Dies ist in der Tat die Automatisierung der ImageToDatatable-JSL bereits geschriebenes Skript, sondern jedes Bild innerhalb eines Ordners durchgehen und die resultierende Datentabelle mit einer daraus resultierenden Analyse der Pixel im selben Ordner speichern.
Die x- und y-Koordinaten zusammen mit RGB, I und HSL reichen für mich aus, um jede gewünschte Analyse durchzuführen. Ich habe eine Beispieldatentabelle angehängt, die ich analysieren kann, ich habe auch das Originalbild angehängt, aus dem diese Daten stammen, ich habe ein paar tausend davon, die ich durchgehen muss, also würde ich sie einzeln machen fast unmöglich.
Entschuldigung nochmals für die schlechte Formulierung und Unklarheit im ursprünglichen Beitrag.
Grüße
David
Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und zum nächsten Bild wechselnKonsolidierung von zwei Antworten auf diesen Beitrag als Lösung.
Teil 1 von Mitarbeiter @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" );
);
);
Teil 2 von Mitarbeiter @JohnPonte :
Eine Sache, die ich vorschlagen werde, ist, dass Sie NewImage() anstelle von Open() für die Bilddatei verwenden können. Open() ist eine allgemeinere Funktion, die herausfinden muss, was Sie öffnen. Bei diesem Vorgang werden Betriebssystemfunktionen verwendet, z. B. das Öffnen Ihres Bildes in einem anderen Programm. img = NewImage("Dateiname.jpg"); öffnet die Bilddatei und erstellt ein JSL-Bild, das Ihnen das Handle dafür zurückgibt.
Der andere Vorschlag ist, dass Sie ein anderes Skript verwenden können, das ich (vor dem Image Analyzer) für den Dateiaustausch namens ImageToDatatable . Es konvertiert Ihr Bild in eine Datentabelle, ähnlich wie der Image Analyzer, aber Sie erhalten nicht den Rest dessen, was der Image Analyzer tut.
Wickeln Sie das in die Schleife als ein @Craige_Hales zeigt (oben) und Sie sollten startklar sein.
Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und zum nächsten Bild wechseln<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich bin gerade auf diesen Beitrag gestoßen und dachte, ich würde ein paar Punkte hinzufügen, falls es noch hilfreich ist.
Eine Sache, die ich vorschlagen werde, ist, dass Sie NewImage() anstelle von Open() für die Bilddatei verwenden können. Open() ist eine allgemeinere Funktion, die herausfinden muss, was Sie öffnen. Bei diesem Vorgang werden Betriebssystemfunktionen verwendet, z. B. das Öffnen Ihres Bildes in einem anderen Programm. img = NewImage("Dateiname.jpg"); öffnet die Bilddatei und erstellt ein JSL-Bild, das Ihnen das Handle dafür zurückgibt.
Der andere Vorschlag ist, dass Sie ein anderes Skript verwenden können, das ich (vor dem Image Analyzer) für den Dateiaustausch erstellt habe, genannt ImageToDatatable . Es konvertiert Ihr Bild in eine Datentabelle, ähnlich wie der Image Analyzer, aber Sie erhalten nicht den Rest dessen, was der Image Analyzer tut.
Wickeln Sie das in die Schleife als ein Craige@JMP zeigt (oben) und Sie sollten startklar sein.
Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und zum nächsten Bild wechselnpath = "$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" ); ););Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und zum nächsten Bild wechselnViele Entschuldigungen, ich war nicht klar genug in meinem ursprünglichen Beitrag. Ich möchte die Pixelinformationen in eine Datentabelle einfügen, nicht das Originalbild selbst.
Dies ist in der Tat die Automatisierung der ImageToDatatable-JSL bereits geschriebenes Skript, sondern jedes Bild innerhalb eines Ordners durchgehen und die resultierende Datentabelle mit einer daraus resultierenden Analyse der Pixel im selben Ordner speichern.
Die x- und y-Koordinaten zusammen mit RGB, I und HSL reichen für mich aus, um jede gewünschte Analyse durchzuführen. Ich habe eine Beispieldatentabelle angehängt, die ich analysieren kann, ich habe auch das Originalbild angehängt, aus dem diese Daten stammen, ich habe ein paar tausend davon, die ich durchgehen muss, also würde ich sie einzeln machen fast unmöglich.
Entschuldigung nochmals für die schlechte Formulierung und Unklarheit im ursprünglichen Beitrag.
David.
Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und zum nächsten Bild wechselnfügen Sie den Dateitypparameter hinzu.dann ist der zurückgegebene Wert ein Bildobjekt.Es wird wahrscheinlich auch funktionieren, wenn Sie PNG, JPG, GIF mischen und anpassen; Es weist JMP an, das Bild zurückzugeben, anstatt auf das Standardprogramm des Betriebssystems für die Erweiterung zurückzugreifen.
open("$desktop/setFont.PNG","PNG")
Neues Bild(
Zeichen zu Blob (
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
oder verwenden Sie newimage, um das Bildobjekt zu erhalten.
newimage("$desktop/setFont.PNG")
Neues Bild(
Zeichen zu Blob (
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
newimage ist einfacher; open ist möglicherweise erforderlich, wenn das Bild eine URL oder ein Blob ist.
Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und zum nächsten Bild wechselnDies sollte die Bilddateien in einem Ordner in einer JMP-Tabelle ablegen:
// ian.cox@jmp.com :23. Juni 2014
Namen standardmäßig hierher ( 1 ) ;
dir = Verzeichnis auswählen ( "Wählen Sie ein Verzeichnis mit Bilddateien:" ) ;
fListe = Dateien im Verzeichnis ( dir ) ;
wenn ( NIArtikel ( fListe ) < 1 , Drucken ( "Keine Dateien im Ordner gefunden" || dir || "." ) ; Signalton () ; Wurf ()) ;
dt = NeueTabelle ( "Bilder von" || dir ,
NeueSpalte ( "Dateipfad" , Charakter , Nominal ) ,
NeueSpalte ( "Bild" , Ausdruck ) , Zeilen hinzufügen ( NIArtikel ( fListe ))
) ;
zum ( f = 1 , f <= Nitems ( fListe ) , f ++,
fp = dir || "/" || fListe [ f ] ;
Spalte ( dt , "Dateipfad" )[ f ] = fp ;
Versuchen ( Spalte ( dt , "Bild" )[ f ] = Neues Bild ( fp )) ; // Verwenden Sie 'Try()', falls es keine Bilddatei ist
) ;