画像 (jpg) ファイルを開いて分析を実行し、次の画像に移動します私は JMP を使用して自動画像処理と分析を行うことに非常に興味があり、スクリプト (John Pontes アドインに大きく基づいており、彼の優れたブログから収集した情報) を持っています。 John Ponte、JMP ブログ著者)画像上で一度に1つの画像に対して実行できますが、次に本当にやりたいのは、次のことを行う「ループ」スクリプトを作成することです。
- ディレクトリ内の .jpg ファイルの数をカウントします。
- 画像を 1 つずつ開き、利用可能な情報 (このために John Pontes 画像アナライザー アドインとスクリプトを使用しています) をデータ テーブルに配置します。
- 基本的な分析を行います(列と行の平均など)
- これをjpgファイル名で保存します
- ファイルを閉じて次の画像に進みます。
これには小さな問題がいくつかありますが、主な問題は次のとおりです。
のために(私= 1 、私<= N 個のアイテム(ファイル) 、私++、
もし(で終わる(ファイル[私] 、 「.jpg」 ) 、
開ける(ファイル[私] ) ;
);
開いている ( ファイル); jpgファイルを別のプログラム(変更したくないデフォルトのプログラム)で開きます。 以下を使用してJMPで開くようにするにはどうすればよいですか(または、それがより良い場合は他のもの)
画像=新しいイメージ( 「.jpgのファイル名」 ) ;
w =新しい窓( "画像" 、画像) ;
その後、分析を実行し、これをすべて閉じて、すべての画像の分析が完了するまでループバックします。
[*スタッフメンバー sseligman によるオリジナルの投稿を編集しました。 ユーザーの質問の 2 番目の部分が元の投稿に追加されました。]
申し訳ありませんが、元の投稿では十分に明確ではありませんでした。 私がやりたいのは、元の画像そのものではなく、ピクセル情報をデータテーブルに入れることです。
これは事実上、 ImageToDatatable JSLこのスクリプトはすでに記述されていますが、フォルダー内の各画像を調べて、結果として得られたピクセルの分析結果を含むデータ テーブルを同じフォルダーに保存します。
必要な分析を実行するには、x 座標と y 座標、RGB、I、HSL があれば十分です。 分析を実行できるサンプル データ テーブルを添付しました。また、このデータが取得された元の画像も添付しました。これらは数千件あるため、一度に 1 つずつ実行する必要があります。ほぼ不可能です。
元の投稿の不適切な表現と明確さの欠如について再度お詫び申し上げます。
よろしく
デビッド
Re: 画像 (jpg) ファイルを開いて分析を実行し、次の画像に移動するこの投稿に対する 2 つの返信を解決策として統合します。
スタッフよりその1 @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" );
);
);
スタッフよりその2 @ジョンポンテ:
私が提案したいのは、画像ファイルに Open() の代わりに NewImage() を使用できるということです。 Open() は、何を開いているかを把握する必要があるより一般的な関数です。 そのプロセスでは、別のプログラムで画像を開くなど、OS の機能が使用されます。 img = NewImage("ファイル名.jpg");イメージ ファイルを開いて JSL イメージを作成し、そのハンドルを返します。
もう 1 つの提案は、私が (Image Analyzer の前に) 実行した別のスクリプトを File Exchange で使用できるというものです。画像からデータテーブルへ。 Image Analyzer と同様に、画像をデータ テーブルに変換しますが、Image Analyzer の残りの機能をすべて取得することはできません。
それを次のようにループ内にラップします@Craige_Hales (上) を参照すれば、準備完了です。
Re: 画像 (jpg) ファイルを開いて分析を実行し、次の画像に移動する<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />この投稿を見つけたので、まだ役立つ場合に備えて、いくつかのポイントを追加したいと思いました。
私が提案したいのは、画像ファイルに Open() の代わりに NewImage() を使用できるということです。 Open() は、何を開いているかを把握する必要があるより一般的な関数です。 そのプロセスでは、別のプログラムで画像を開くなど、OS の機能が使用されます。 img = NewImage("ファイル名.jpg");イメージ ファイルを開いて JSL イメージを作成し、そのハンドルを返します。
もう 1 つの提案は、私が (Image Analyzer の前に) 実行した別のスクリプトを File Exchange で使用できるというものです。画像からデータテーブルへ。 Image Analyzer と同様に、画像をデータ テーブルに変換しますが、Image Analyzer の残りの機能をすべて取得することはできません。
それを次のようにループ内にラップしますクレイジ@JMP (上) を参照すれば、準備完了です。
Re: 画像 (jpg) ファイルを開いて分析を実行し、次の画像に移動する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" ); ););Re: 画像 (jpg) ファイルを開いて分析を実行し、次の画像に移動する申し訳ありませんが、元の投稿では十分に明確ではありませんでした。 私がやりたいのは、元の画像そのものではなく、ピクセル情報をデータテーブルに入れることです。
これは事実上、 ImageToDatatable JSLこのスクリプトはすでに記述されていますが、フォルダー内の各画像を調べて、結果として得られたピクセルの分析結果を含むデータ テーブルを同じフォルダーに保存します。
必要な分析を実行するには、x 座標と y 座標、RGB、I、HSL があれば十分です。 分析を実行できるサンプル データ テーブルを添付しました。また、このデータが取得された元の画像も添付しました。これらは数千件あるため、一度に 1 つずつ実行する必要があります。ほぼ不可能です。
元の投稿の不適切な表現と明確さの欠如について再度お詫び申し上げます。
デビッド。
Re: 画像 (jpg) ファイルを開いて分析を実行し、次の画像に移動するファイルタイプパラメータを追加します。その場合、戻り値は画像オブジェクトになります。PNG、JPG、GIF を組み合わせてもおそらく機能します。これは、拡張機能に対して OS のデフォルト プログラムに頼るのではなく、画像を返すように JMP に指示します。
open("$desktop/setFont.PNG","PNG")
新しいイメージ(
Char から Blob(
「640745ejkkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
または、 newimage を使用して画像オブジェクトを取得します。
newimage("$desktop/setFont.PNG")
新しいイメージ(
Char から Blob(
「640745ejkkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
newimage の方が簡単です。画像が URL または Blob の場合は、open が必要になる場合があります。
Re: 画像 (jpg) ファイルを開いて分析を実行し、次の画像に移動するこれにより、フォルダー内の画像ファイルが JMP テーブルに配置されます。
// ian.cox@jmp.com :2014年6月23日
デフォルトの名前はここにあります( 1 ) ;
ディレクトリ=ディレクトリの選択( 「画像ファイルを含むディレクトリを選択してください:」 ) ;
fリスト=ディレクトリ内のファイル(ディレクトリ) ;
もし( Nアイテム( fリスト) < 1 、印刷する( 「フォルダ内にファイルが見つかりません」 ||ディレクトリ|| 「。」 ) ;ビープ() ;投げる()) ;
dt =新しいテーブル( 「からの画像」 ||ディレクトリ、
新しい列( "ファイルパス" 、キャラクター、公称) 、
新しい列( "画像" 、表現) 、行の追加( Nアイテム( fリスト))
) ;
のために( f = 1 、 f <=ニテムス( fリスト) 、 f ++、
FP =ディレクトリ|| 「/」 || fリスト[ f 】 ;
カラム( dt 、 "ファイルパス" )[ f ] = FP ;
試す(カラム( dt 、 "画像" )[ f 】 =新しいイメージ( FP )) ; // 画像ファイルではない場合は 'Try()' を使用します
) ;