Wenn Sie am JMP teilgenommen haben Discovery Summit 2011 in Denver, Colorado, im September, haben Sie vielleicht auf meiner Präsentation gesessen, Bild ist nicht alles, aber es ist sicher etwas in JMP 9 . Ich sprach über die Bildfunktionalität, die hinzugefügt wurde JMP für Version 9, und ich habe einige Praxisbeispiele gezeigt, wie JMP-Benutzer die Bildfunktionalität verwenden, um in ihren Bildern enthaltene Daten zu extrahieren. Ich habe einige JSL-Skripte (JMP Scripting Language) in der Hoffnung geteilt, in der Hoffnung, dass die Bemühungen um die Verwendung der Image-Funktionalität möglicherweise einen Anfang machen. Aus diesem Grund entschied ich mich, eine JSL-Datei mit Code-Snippets zusammenzustellen, die auch die Image-Funktionalität demonstriert. Diese Datei wurde aufgerufen ImageExamples.jsl , kann in der JMP gefunden werden Dateiaustausch . Lassen Sie uns ein paar Beispiele aus dieser Datei ziehen und ein wenig mehr darüber erzählen.
Als erstes sollten Sie ein vorhandenes Image in JMP einfügen. Verwenden Sie dazu einfach den Befehl Neues Bild.
img = neues Bild ( "C: \ Benutzer \ sasjvp \ Pictures \ Yellowstone08 \ IMG_0262.JPG" ) ;
neues Fenster ( "Original Bild" . img ) ;

In diesem Beispiel wird ein JPEG-Bild eingelesen und in JSL als Bildobjekt mit dem Namen img gespeichert. NewImage () kann JPG-, PNG-, BMP-, GIF- und TIF-Dateien lesen.
Als ich das zum ersten Mal tat, war das resultierende Fenster sehr groß, da das Bild so groß war. Ich fragte mich, wie groß das Bild eigentlich war, also tat ich Folgendes:
{ w . h } = img << getSize () ;
Dieser Befehl gab mir die Breite und Höhe des Bildes (3264 x 2448), ein ziemlich großes Bild. Um es in einer angemesseneren Größe anzuzeigen, habe ich es verkleinert, indem ich eine neue Breite und Höhe für das Bild angegeben habe.
img << setSize ( { w / 4 . h / 4 } ) ;
Das Bild ist jetzt 816 x 612 oder ein Viertel der Originalgröße in jeder Dimension. Beachten Sie, dass Breite und Höhe als Liste übergeben werden, indem Sie sie in geschweifte Klammern einwickeln.
Jetzt möchte ich das Bild bearbeiten, aber ich möchte die Originalversion beibehalten. Also werde ich mit NewImage () eine Kopie meines Bildes erstellen.
img2 = neues Bild ( img ) ;
Dadurch wird eine Kopie meines Originalbilds als zweites Bild mit dem Namen img2 erstellt.
Als nächstes möchte ich die Pixelwerte des Bildes ermitteln. Da es sich bei meinem Bild um ein Farbbild handelt, wird jedes Pixel als dreifarbige Komponente definiert: Rot, Grün und Blau. Die Pixeldaten werden als Matrix für jede Farbkomponente zurückgegeben, nach der ich frage.
{ r . G . b } = img2 << getPixels ( "rgb" ) ;
In diesem Fall bekomme ich drei Matrizen. Wenn mein Bild Transparenz enthält, könnte ich vier Matrizen anfordern, indem Sie "rgba" angeben. Ich kann auch nur nach einer Farbkomponente fragen, indem ich einfach die gewünschte Komponente spezifiziere, z. B. "g" für die grüne Komponente. Jede Matrix stellt die Pixelfarbwerte im normalisierten Farbraum dar, dh die Werte liegen zwischen 0,0 und 1,0 (einschließlich).
Das Schöne daran, die Pixelwerte als Matrizen zu erhalten, ist, dass ich jetzt Matrix-Mathematik für meine Pixel durchführen kann. Wenn ich eine Graustufenversion meines Bildes erstellen wollte, könnte ich dies ganz einfach mit der folgenden Formel tun.
ich = .30 * r + .59 * G + .11 * b ;
Dies ist die gleiche Formel, die ein Fernsehgerät verwenden würde, um eine Farbshow in Schwarzweiß umzuwandeln. Wenn Sie so alt wie ich sind, erinnern Sie sich vielleicht an den Schwarzweißfernseher, bei dem es sich nicht nur um Schwarzweiß handelte, sondern um einen Bereich zwischen Schwarz und Weiß. Diese Formel kombiniert 30% meiner roten Komponente mit 59% meiner grünen Komponente und 11% meiner blauen Komponente. Dies berechnet einen Intensitätswert für meine Grauskala. Jetzt kann ich die ursprünglichen Farbkomponenten Rot, Grün und Blau durch die Graustufenintensitätswerte ersetzen, um ein Graustufenbild zu erzeugen.
img2 << setPixels ( "rgb" . { ich . ich . ich } ) ;
Hier ist das Ergebnis.

Da JMP Matrixmathematik in JSL unterstützt, müssen wir das Bild nicht durchlaufen und jedes Pixel einzeln bearbeiten. Wir können diese Formel gleichzeitig auf das gesamte Bild anwenden, was bequem und effizient ist.

Die eigentliche Stärke von JMP ist natürlich die Fähigkeit, statistische Analysen und Datenermittlungen durchzuführen. Dazu benötigen wir die Daten in Form einer Datentabelle. Lassen Sie uns also ein Bild einlesen, die Pixeldaten extrahieren und daraus eine Datentabelle erstellen.
Schauen wir uns ein Bild aus einer MRI an. Wir können den Befehl NewImage () wie zuvor verwenden, um das Bild in JMP einzulesen. Wir können den Befehl getPixels () auch wie zuvor verwenden, mit der Ausnahme, dass dieses Bild bereits ein Graustufenbild ist. Daher müssen wir nur nach einer Farbkomponente fragen. Die erste Komponente wird immer noch als "r" -Komponente bezeichnet. Sobald wir die Pixelwerte haben, können wir die Datentabelle erstellen.
img = Neues Bild ( "C: \ JMP \ mri.jpg" ) ;
{ pix } = img << getPixels ( "r" ) ;
dt = Neue Tabelle ( "Pixeldaten" .
newColumn ( "Werte" . Werte setzen ( pix ))) ;
Verteilung ( Kontinuierliche Verteilung ( Säule ( : Werte ) . Ausreißerbox
Handlung ( 0 ) ) ) ;
neues Fenster ( "Bilddaten analysieren" . img ) ;
Die Pixelwerte befinden sich jetzt in einer Datentabelle wie alle anderen in JMP eingelesenen Daten. Dies bedeutet, dass wir jetzt die statistischen Analysefunktionen in JMP verwenden können, um die Daten zu analysieren. Was Sie zu diesem Zeitpunkt verwenden, hängt davon ab, was Ihre Daten sind und welche Fragen Sie beantworten möchten. In diesem Beispiel habe ich eine einfache Verteilung durchgeführt, um den Bereich und die Häufigkeit meiner Daten anzuzeigen.

Ich hoffe, dass ich Ihnen zu diesem Zeitpunkt genug Beispiele gegeben habe, um Sie mit der Verwendung von Bildern in JMP zu beginnen. Vergessen Sie nicht, das Beispielskript herunterzuladen. ImageExamples.jsl von der JMP Dateiaustausch . Es zeigt mehr Beispiele als ich hier erwähnt habe. Es enthält unter anderem Befehle für Rotation, Transparenz und Filter. Lass mich wissen was du denkst.