Öffnen Sie Bilddateien (jpg), führen Sie eine Analyse durch und fahren Sie mit dem nächsten Bild fortIch 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 Ponte basiert) und Informationen aus seinem hervorragenden Blog John Ponte, Autor bei JMP Blog ), dass ich jeweils ein Bild 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 Analysis-Add-In und das Skript) in eine Datentabelle ein
- führt eine grundlegende Analyse durch (Mittelwert von Spalten und Zeilen usw.)
- speichert dies unter dem JPG-Dateinamen
- Schließt die Dateien und geht zum nächsten Bild über.
Ich habe eine Reihe kleinerer Probleme damit, aber die größten sind, wenn ich Folgendes verwende
Für ( 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 (dem Standardprogramm, das ich nicht ändern möchte). Wie bekomme ich es so hin, dass es in JMP geöffnet wird, indem ich Folgendes verwende (oder etwas anderes, wenn es besser ist)
Bild = Neues Bild ( „thefilenameofthe.jpg“ ) ;
w = Neues Fenster ( "Bild" , Bild) ;
Anschließend kann ich die Analyse durchführen, alles schließen und zurückgehen, bis alle Bilder analysiert wurden.
[*Bearbeiten des Originalbeitrags von Mitarbeiter Sseligman. Zweiter Teil der Benutzerfrage hier zum ursprünglichen Beitrag hinzugefügt.]
Entschuldigung, ich habe mich in meinem ursprünglichen Beitrag nicht klar genug ausgedrückt. Ich möchte die Pixelinformationen in eine Datentabelle einfügen, nicht das Originalbild selbst.
Dies ist im Grunde eine Automatisierung ImageToDatatable JSL Skript, das bereits geschrieben wurde, aber gehen Sie jedes Bild in einem Ordner durch und speichern Sie die resultierende Datentabelle mit allen resultierenden Analysen der Pixel im selben Ordner.
Die x- und y-Koordinaten zusammen mit RGB, I und HSL reichen aus, um jede gewünschte Analyse durchzuführen. Ich habe eine Beispieldatentabelle angehängt, die ich analysieren kann. Außerdem habe ich 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 durchgehen fast unmöglich.
Ich entschuldige mich noch einmal für die schlechte Formulierung und Unklarheit im ursprünglichen Beitrag.
Grüße
David
Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und mit dem nächsten Bild fortfahrenKonsolidierung zweier Antworten auf diesen Beitrag als Lösung.
Teil 1 vom 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 vom Mitarbeiter @JohnPonte :
Ich schlage vor, dass Sie für die Bilddatei NewImage() anstelle von Open() verwenden können. Open() ist eine allgemeinere Funktion, die herausfinden muss, was Sie öffnen. Dabei werden Betriebssystemfunktionen genutzt, etwa das Öffnen Ihres Bildes in einem anderen Programm. img = NewImage("filename.jpg"); öffnet die Bilddatei, erstellt ein JSL-Bild und gibt Ihnen das Handle dafür zurück.
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 wandelt Ihr Bild in eine Datentabelle um, ähnlich wie der Bildanalysator, aber Sie erhalten nicht alle anderen Funktionen des Bildanalysators.
Wickeln Sie das in die Schleife als @Craige_Hales zeigt (oben) und Sie sollten startklar sein.
Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und mit dem nächsten Bild fortfahren<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 er immer noch hilfreich ist.
Ich schlage vor, dass Sie für die Bilddatei NewImage() anstelle von Open() verwenden können. Open() ist eine allgemeinere Funktion, die herausfinden muss, was Sie öffnen. Dabei werden Betriebssystemfunktionen genutzt, etwa das Öffnen Ihres Bildes in einem anderen Programm. img = NewImage("filename.jpg"); öffnet die Bilddatei, erstellt ein JSL-Bild und gibt Ihnen das Handle dafür zurück.
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 wandelt Ihr Bild in eine Datentabelle um, ähnlich wie der Bildanalysator, aber Sie erhalten nicht alle anderen Funktionen des Bildanalysators.
Wickeln Sie das in die Schleife als Craige@JMP zeigt (oben) und Sie sollten startklar sein.
Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und mit dem nächsten Bild fortfahrenpath = "$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 mit dem nächsten Bild fortfahrenEntschuldigung, ich habe mich in meinem ursprünglichen Beitrag nicht klar genug ausgedrückt. Ich möchte die Pixelinformationen in eine Datentabelle einfügen, nicht das Originalbild selbst.
Dies ist im Grunde eine Automatisierung ImageToDatatable JSL Skript, das bereits geschrieben wurde, aber gehen Sie jedes Bild in einem Ordner durch und speichern Sie die resultierende Datentabelle mit allen resultierenden Analysen der Pixel im selben Ordner.
Die x- und y-Koordinaten zusammen mit RGB, I und HSL reichen aus, um jede gewünschte Analyse durchzuführen. Ich habe eine Beispieldatentabelle angehängt, die ich analysieren kann. Außerdem habe ich 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 durchgehen fast unmöglich.
Ich entschuldige mich noch einmal für die schlechte Formulierung und Unklarheit im ursprünglichen Beitrag.
David.
Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und mit dem nächsten Bild fortfahrenFügen Sie den Dateitypparameter hinzu.dann ist der zurückgegebene Wert ein Bildobjekt.Es wird wahrscheinlich auch dann funktionieren, wenn Sie PNG, JPG, GIF mischen und anpassen; Es weist JMP an, das Bild zurückzugeben, anstatt für die Erweiterung auf das Standardprogramm des Betriebssystems zurückzugreifen.
open("$desktop/setFont.PNG","PNG")
Neues Bild(
Char To Blob(
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
oder verwenden Sie newimage, um das Bildobjekt abzurufen.
newimage("$desktop/setFont.PNG")
Neues Bild(
Char To Blob(
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
newimage ist einfacher; open ist möglicherweise erforderlich, wenn es sich bei dem Bild um eine URL oder einen Blob handelt.
Betreff: Bilddateien (jpg) öffnen, Analyse durchführen und mit dem nächsten Bild fortfahrenDadurch sollten die Bilddateien in einem Ordner in einer JMP-Tabelle abgelegt werden:
// ian.cox@jmp.com :23. Juni 2014
Namen standardmäßig hier ( 1 ) ;
dir = Wählen Sie Verzeichnis ( „Wählen Sie ein Verzeichnis mit Bilddateien:“ ) ;
fListe = FilesInDirectory ( dir ) ;
Wenn ( NItems ( fListe ) < 1 , Drucken ( „Keine Dateien im Ordner gefunden“ || dir || "." ) ; Piep () ; Werfen ()) ;
dt = NeueTabelle ( „Bilder von“ || dir ,
Neue Spalte ( "Dateipfad" , Charakter , Nominell ) ,
Neue Spalte ( "Bild" , Ausdruck ) , Zeilen hinzufügen ( NItems ( fListe ))
) ;
für ( F = 1 , F <= Nitems ( fListe ) , F ++,
fp = dir || „/“ || fListe [ F ] ;
Spalte ( dt , "Dateipfad" )[ F ] = fp ;
Versuchen ( Spalte ( dt , "Bild" )[ F ] = Neues Bild ( fp )) ; // „Try()“ verwenden, falls es sich nicht um eine Bilddatei handelt
) ;