Erstellen Sie eine JMP-FunktionLieber jedermann,
Meine Kenntnisse in der JMP-Skripterstellung sind gering und SAS erlaubt mir nicht, das zu tun, was ich in JMP in Bezug auf die Bildverarbeitung tun kann.
Ich habe ein vorhandenes JMP-Skript ein wenig angepasst ( JohnPonte ), mit denen ich RGB-Daten aus Bildern generieren kann.
Das Skript ermöglicht es mir, dies für ein Bild zu tun, und ich habe mehr als 300 Bilder.
In SAS ist es für mich einfach, ein Makro zu erstellen, um dies automatisiert zu erledigen, in JMP jedoch nicht.
Die Eingabe (Bild) und die Ausgabe (SAS-Datensatz) haben denselben Namen ( in rot ), bedeutet dies, dass die Funktion nur ein Argument hat.
Die Namen aller Bilder, die ich behandeln möchte, werden im JMP-Datensatz (Datensatz mit einer Spalte) gespeichert.
Hier ist das Skript:
NamesDefaultToHere(1);
// Das Bild in JMP einlesen
img = NewImage("D:\ M1_ACTIVE_ZL_T00 .jpg");
w = newWindow("image", img);
// Holen Sie sich die Pixelwerte als 3 verschiedene Matrizen (rot, grün und blau)
// RGB-Farben liegen im normalisierten Farbraum (0,0-1,0) vor.
{r, g, b} = img << getPixels("rgb");
// Konvertieren Sie RGB in eine Graustufenmatrix (Intensität).
i = 0,3*r + 0,59*g + 0,11*b;
// Holen Sie sich die Pixelwerte als JSL-Farben und konvertieren Sie sie dann in Farbton, Helligkeit und Sättigung
// HLS-Farben liegen im normalisierten Farbraum (0,0-1,0) vor.
jslColors = img << getPixels();
{h, l, s} = ColorToHLS(jslColors);
// Die Abmessungen des Bildes/der Matrizen abrufen
numRows = nrow(r);
numCols = ncol(r);
// Eine Datentabelle erstellen
dt = Neue Tabelle("Bilddaten",
newColumn("X", Werte festlegen(repeat(1::numCols, numRows))),
newColumn("Y", Werte festlegen(shape(repeat(1::numRows,numCols)`,numCols,numRows))),
newColumn("r", Werte festlegen(r)),
newColumn("g", Werte festlegen(g)),
newColumn("b", Werte festlegen(b)),
newColumn("i", Werte festlegen(i)),
newColumn("h", Werte festlegen(h)),
newColumn("l", Werte festlegen(l)),
newColumn("s", Werte festlegen)
);
dt << Save("D:\ M1_ACTIVE_ZL_T00 .sas7bdat");
Close(dt);
img< w<
Vielen Dank im Voraus für unsere Hilfe.
ganz liebe Grüße,
Samir
Betreff: Erstellen Sie eine JMP-FunktionIch würde die Verwendung von „j“ als Variable vermeiden, da es sich auch um eine JSL-Funktion handelt. Versuchen Sie es stattdessen mit „k“.
J (nrows, , )
Beschreibung: Erstellt eine Matrix identischer Werte.
Rückgabe: Die Matrix.
Argumente:
nrows Anzahl der Zeilen in der Matrix. Wenn ncols nicht angegeben ist, werden auch nrows als ncols verwendet.
ncols Anzahl der Spalten in der Matrix.
Wert Der Wert, der zum Auffüllen der Matrix verwendet wird. Wenn kein Wert angegeben ist, wird 1 verwendet.
Betreff: Erstellen Sie eine JMP-FunktionIch freue mich, dass Sie auch das Problem mit der „i“-Variable erkannt haben.Was wahrscheinlich wirklich getan werden sollte, ist, die Variablen in der Funktion als lokal für die Funktion zu deklarieren.Dies würde das Problem lösen, ohne dass die Variablennamen geändert werden müssten
ImageProcessing = Function( {ImagePath},
{img,w,i,r,g,b,h,l,s,numRows,numCols,dt},
Betreff: Erstellen Sie eine JMP-FunktionDanke Jim,
Es funktioniert jetzt 
Aber ich habe auch i durch j ersetzt.
Ich verstehe nicht, warum ich nicht arbeite.
Einen schönen Tag noch,
Samir
Betreff: Erstellen Sie eine JMP-FunktionIch gehe davon aus, dass der Grund dafür, dass es nach nur einem Bild aufgehört hat, darin besteht, dass ich versehentlich die Variable „dt“ verwendet habe, um auf die Datentabelle zu verweisen, die die Bildnamen enthält, und dass innerhalb der Funktion auch die Variable „dt“ verwendet wurde, die sich geändert hat dessen Wert.Dies lässt sich leicht lösen, indem man entweder die Variable „dt“ innerhalb der Funktion lokalisiert oder einfach die Variable „dt“ außerhalb der Funktion ändert.Ich habe mich für Letzteres entschieden und es im Beispiel unten in „dtimage“ umbenannt.
Names Default To Here( 1 );
// Read the image into JMP M1_ACTIVE_ZL_T00
ImageProcessing = Function( {ImagePath},
img = New Image( "D:\" || ImagePath || ".jpg" );
w = New Window( "image", img );
// Get the pixel values as 3 distinct matrices (red, green and blue)
// RGB colors are in normalized color space (0.0-1.0)
{r, g, b} = img << getPixels( "rgb" );
// Convert rgb to gray-scale (intensity) matrix
i = 0.3 * r + 0.59 * g + 0.11 * b;
// Get the pixel values as JSL colors then convert to hue, lightness and saturation
// HLS colors are in normalized color space (0.0-1.0)
jslColors = img << getPixels();
{h, l, s} = Color To HLS( jslColors );
// Get the dimensions of the image/matrices
numRows = N Row( r );
numCols = N Col( r );
// Create a data table
dt = New Table( "Image Data",
New Column( "X", set values( Repeat( 1 :: numCols, numRows ) ) ),
New Column( "Y", set values( Shape( Repeat( 1 :: numRows, numCols )`, numCols, numRows ) ) ),
New Column( "r", set values( r ) ),
New Column( "g", set values( g ) ),
New Column( "b", set values( b ) ),
New Column( "i", set values( i ) ),
New Column( "h", set values( h ) ),
New Column( "l", set values( l ) ),
New Column( "s", set values( s ) )
);
dt << Save( "D:\" || ImagePath || ".sas7bdat" );
Close( dt, nosave );
img << close Window();
w << close Window();
);
dtimage = Open( "path to data table with the one column with image names" );
// We will pretend that the column name is "TheImage"
For( i = 1, i <= N Rows( dtimage ), i++,
return = ImageProcessing( dtimage:TheImage[i] )
);Betreff: Erstellen Sie eine JMP-FunktionIhn,
Ja, ich sehe diese Funktion im Bildverarbeitungs-Add-In.
Es ist nützlich.
Krs,
Samir
Betreff: Erstellen Sie eine JMP-FunktionHallo Craige,
Vielen Dank für Ihre Antwort. Ich bin mir sicher, dass ich das in den nächsten Tagen brauchen werde.
Krs,
Samir
Betreff: Erstellen Sie eine JMP-FunktionLieber Jim,
Vielen Dank für den Code, er ist genau das, was ich will.
Das einzige Problem ist, dass die Funktion nur die erste Zeile meiner Tabelle ausführt.
Hast du eine Idee warum?
Wenn ich „Klein“ sage, spreche ich über mein Wissen über JMP, nicht über JMP 
vVielen Dank im Voraus für Ihre Rückmeldungen.
Samir
Betreff: Erstellen Sie eine JMP-FunktionEin verwandter Gedanke: Wenn Sie eine Datei mit mehreren Bildern haben (z. B. ein animiertes GIF oder die in der Mikroskopie üblichen TIF-Stapel), lädt JMP 13 (nur Windows-Version) diese direkt als einen Datensatz. Wenn Sie über sequentielle Bilddaten verfügen, können Sie diesen Weg in Betracht ziehen und Ihre Bilder in eine Datei mit mehreren Bildern packen. Es erleichtert auch die Pflege Ihrer Bildarchive.
M
Betreff: Erstellen Sie eine JMP-FunktionHier sind einige Ideen, die hilfreich sein könnten.
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "name",
Character,
"Nominal",
Set Selected,
Set Values( {"aaa", "bb", "cccc"} )
)
);
processFun = Function( {inputfile, outputfile},
{default local},
Show( inputfile, outputfile )
);
For( irow = 1, irow <= N Rows( dt ), irow++,
input = "c:/directory3/" || dt:name[irow] || ".jpg";
output = "c:/directory2/" || dt:name[irow] || ".png";
processFun( input, output );
);
/*:
inputfile = "c:/directory3/aaa.jpg";
outputfile = "c:/directory2/aaa.png";
inputfile = "c:/directory3/bb.jpg";
outputfile = "c:/directory2/bb.png";
inputfile = "c:/directory3/cccc.jpg";
outputfile = "c:/directory2/cccc.png";
Das Beispiel zeigt eine Benutzerfunktion „processFun“, die zwei Argumente hat, und zeigt eine Schleife, die eine Datentabelle liest, und zeigt einige String-Verkettungsoperatoren, um die benötigten Namen aufzubauen.
Betreff: Erstellen Sie eine JMP-FunktionIch gebe zu, dass SAS im Vergleich zu SAS und JMP ein viel größeres System ist, aber ich kann Ihnen nicht zustimmen, dass JMP klein ist.Hier ist Ihr Skript, das ganz einfach geändert wurde und das tun soll, was Sie wollen.JMP muss nicht wie SAS über eine separate Makrosprache verfügen, da in die Sprache von JMP (JSL) die Codegenerierung usw. direkt integriert ist.
Hier ist der Code, den ich mir ausgedacht habe
Names Default To Here( 1 );
// Read the image into JMP M1_ACTIVE_ZL_T00
ImageProcessing = Function( {ImagePath},
img = New Image( "D:\" || ImagePath || ".jpg" );
w = New Window( "image", img );
// Get the pixel values as 3 distinct matrices (red, green and blue)
// RGB colors are in normalized color space (0.0-1.0)
{r, g, b} = img << getPixels( "rgb" );
// Convert rgb to gray-scale (intensity) matrix
i = 0.3 * r + 0.59 * g + 0.11 * b;
// Get the pixel values as JSL colors then convert to hue, lightness and saturation
// HLS colors are in normalized color space (0.0-1.0)
jslColors = img << getPixels();
{h, l, s} = Color To HLS( jslColors );
// Get the dimensions of the image/matrices
numRows = N Row( r );
numCols = N Col( r );
// Create a data table
dt = New Table( "Image Data",
New Column( "X", set values( Repeat( 1 :: numCols, numRows ) ) ),
New Column( "Y", set values( Shape( Repeat( 1 :: numRows, numCols )`, numCols, numRows ) ) ),
New Column( "r", set values( r ) ),
New Column( "g", set values( g ) ),
New Column( "b", set values( b ) ),
New Column( "i", set values( i ) ),
New Column( "h", set values( h ) ),
New Column( "l", set values( l ) ),
New Column( "s", set values( s ) )
);
dt << Save( "D:\" || ImagePath || ".sas7bdat" );
Close( dt, nosave );
img << close Window();
w << close Window();
);
dt = Open( "path to data table with the one column with image names" );
// We will pretend that the column name is "TheImage"
For( i = 1, i <= N Rows( dt ), i++,
return = ImageProcessing( dt:TheImage[i] )
);