JMP関数の作成親愛なる皆さん、
JMP スクリプトに関する私の知識は浅く、画像処理に関して JMP で実行できることを SAS では実行できません。
既存の JMP スクリプトを少し改造しました (ジョンポンテ) 画像から RGB データを生成できます。
スクリプトでは 1 つの画像に対してそれを行うことができますが、300 個以上の画像があります。
SAS ではマクロを作成して自動化するのは簡単ですが、JMP ではそうはいきません。
入力 (画像) と出力 (SAS データセット) は同じ名前になります (赤で)、これは、関数の引数が 1 つだけであることを意味します。
処理したいすべての画像の名前は、JMP データセット (1 列のデータセット) に保存されます。
スクリプトは次のとおりです。
NamesDefaultToHere(1);
// 画像を JMP に読み込みます
img = NewImage("D:\ M1_ACTIVE_ZL_T00 .jpg");
w = newWindow("画像", img);
// ピクセル値を 3 つの異なる行列 (赤、緑、青) として取得します。
// RGB カラーは正規化された色空間 (0.0-1.0) にあります
{r, g, b} = img << getPixels("rgb");
// rgb をグレースケール (強度) マトリックスに変換します
i = 0.3*r + 0.59*g + 0.11*b;
// ピクセル値を JSL カラーとして取得し、色相、明度、彩度に変換します
// HLS カラーは正規化された色空間 (0.0-1.0) にあります
jslColors = img << getPixels();
{h, l, s} = ColorToHLS(jslColors);
// 画像/行列の寸法を取得します
numRows = nrow(r);
numCols = ncol(r);
// データテーブルを作成する
dt = 新しいテーブル("画像データ",
newColumn("X", 値を設定(repeat(1::numCols, numRows))),
newColumn("Y", 値を設定(shape(repeat(1::numRows,numCols)`,numCols,numRows))),
newColumn("r", 値を設定(r)),
newColumn("g", 値を設定(g)),
newColumn("b", 値を設定(b)),
newColumn("i", 値を設定(i)),
newColumn("h", 値を設定(h)),
newColumn("l", 値を設定(l)),
newColumn("s", 値を設定)
);
dt << 保存("D:\ M1_ACTIVE_ZL_T00 .sas7bdat");
閉じる(dt);
img<<ウィンドウを閉じる();
w<<ウィンドウを閉じる();
よろしくお願いいたします。
大変親切に、
サミール
Re: JMP 関数を作成する「j」は JSL 関数でもあるため、変数として使用することは避けます。 代わりに「k」を試してください。
J (nrows、、)
説明: 同一の値の行列を作成します。
戻り値: 行列。
引数:
狭い行列の行数。 ncols が指定されていない場合は、nrows も ncols として使用されます。
ncols行列の列数。
価値マトリックスに値を設定するために使用される値。 値が指定されていない場合は、1 が使用されます。
Re: JMP 関数を作成する「i」変数の問題も理解できてうれしいです。おそらく実際に行うべきことは、関数内の変数を関数に対してローカルであると宣言することです。これにより、変数名を変更しなくても問題が解決します
ImageProcessing = Function( {ImagePath},
{img,w,i,r,g,b,h,l,s,numRows,numCols,dt},
Re: JMP 関数を作成するありがとう、ジムさん
今では動作します:)
ただし、i も j に置き換えました。
なぜ働かないのか理解できません。
良い1日を、
サミール
Re: JMP 関数を作成するたった 1 枚の画像で停止した理由は、画像名が含まれるデータ テーブルを指すために誤って変数 "dt" を使用し、関数内で変数 "dt" も使用していたためだと思います。それは価値です。これは、関数内で変数 "dt" をローカライズするか、関数の外で変数 "dt" を変更するだけで簡単に解決できます。私は後者を選択し、以下の例では名前を「dtimage」に変更しました。
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] )
);Re: JMP 関数を作成する彼、
はい、この機能は画像処理アドインにあります。
便利ですよ。
クルス、
サミール
Re: JMP 関数を作成するこんにちは、クレイジさん
ご回答ありがとうございます。数日中にこれが必要になると思います。
クルス、
サミール
Re: JMP 関数を作成する親愛なるジムへ
コードをありがとうございます。まさに私が望んでいることです。
唯一の問題は、関数がテーブルの最初の行のみを実行することです。
理由はわかりますか?
私が「小さい」と言うとき、私は JMP についてではなく、JMP についての私の知識について話します 
v フィードバックをお寄せいただきありがとうございます。
サミール
Re: JMP 関数を作成する関連した考え - マルチイメージ ファイル (つまり、顕微鏡で一般的なアニメーション GIF または TIF スタック) がある場合、JMP 13 (Windows バージョンのみ) はこれらを 1 つのデータ セットとして直接ロードします。 連続した画像データがある場合は、この方法を採用し、画像を複数の画像ファイルにパッケージ化することを検討してください。 また、画像アーカイブの保守も容易になります。
M
Re: JMP 関数を作成する役に立つかもしれないアイデアをいくつか紹介します。
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";
この例では、2 つの引数を持つユーザー関数「processFun」を示し、データ テーブルを読み取るループを示し、必要な名前を構築するためのいくつかの文字列連結演算子を示します。
Re: JMP 関数を作成するSAS と JMP の相対的な範囲では、SAS の方がはるかに大規模なシステムであることは認めますが、JMP が小規模であるという意見には同意できません。これは、必要なことを実行するために非常に簡単に変更されたスクリプトです。JMP(JSL)の言語にはコード生成などが直接組み込まれているため、JMPにはSASのように別個のマクロ言語が必要ありません。
これが私が思いついたコードです
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] )
);