開啟影像 (jpg) 文件,執行分析並移至下一個影像我對使用 JMP 進行自動圖像處理和分析非常感興趣,並且我有一個腳本(很大程度上基於 John Pontes 插件 - 以及從他優秀的博客收集的信息John Ponte,JMP 部落客)我可以一次在一個映像上運行,但接下來我真正想做的是創建一個「循環」腳本來執行以下操作
- 計算目錄中 .jpg 檔案的數量。
- 逐一開啟圖像,將可用資訊(我正在使用 John Pontes 圖像分析器插件和腳本)放入資料表中
- 進行基本分析(列和行的平均值等)
- 使用 jpg 檔案名稱儲存它
- 關閉檔案並移至下一個影像。
我對此有很多小問題,但主要的問題是當我使用以下內容時
為了(我= 1 ,我<= N 項(文件) ,我++,
如果(以。。結束(文件[我] , “.jpg” ) ,
打開(文件[我] ) ;
);
開啟的 ( 文件);在另一個程式中開啟 jpg 檔案(我不想更改的預設程式)。 我如何獲取它,以便使用以下命令(或其他更好的方法)在 JMP 中打開它
影像=新圖片( “檔案名稱.jpg” ) ;
w =新窗戶( “圖像” ,圖片) ;
然後我可以執行分析並關閉這一切並循環返回,直到分析完所有圖像。
[*編輯至工作人員 seligman 的原始帖子。 用戶問題的第二部分已添加到原始帖子中。]
非常抱歉,我在原來的帖子中表達得不夠清楚。 我想要做的是將像素資訊放入資料表中,而不是原始影像本身。
這實際上是自動化影像到資料表 JSL已編寫的腳本,但會遍歷資料夾中的每個影像,並將結果資料表以及對同一資料夾中像素的任何結果分析儲存起來。
x 和 y 座標以及 RGB、I 和 HSL 足以讓我執行我需要的任何分析。 我附加了一個可以對其進行分析的範例資料表,我還附加了從中獲取該資料的原始影像,我有數千個需要檢查的資料表,因此一次執行一個將是幾乎不可能。
再次對原帖中的措辭不當和缺乏清晰度表示歉意。
問候
大衛
回覆:開啟影像 (jpg) 文件,執行分析並移至下一個影像合併對此帖子的兩個回應作為解決方案。
工作人員的第 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 部分@約翰龐特:
我建議的一件事是您可以使用 NewImage() 而不是 Open() 來處理映像檔。 Open() 是一個更通用的函數,它必須弄清楚您要開啟的內容。 在此過程中,它使用作業系統功能,例如在另一個程式中開啟圖像。 img = NewImage("檔名.jpg");將打開圖像檔案並創建 JSL 圖像,並返回它的句柄。
另一個建議是您可以使用我在文件交換上編寫的另一個腳本(在圖像分析器之前),稱為影像到資料表。 與影像分析器類似,它會將您的影像轉換為資料表,但您無法獲得影像分析器的所有其餘功能。
將其包裝在循環中作為@Craige_Hales顯示(上圖),您應該可以開始了。
回覆:開啟影像 (jpg) 文件,執行分析並移至下一個影像<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我剛剛看到這篇文章,想補充幾點,以防它仍然有幫助。
我建議的一件事是您可以使用 NewImage() 而不是 Open() 來處理映像檔。 Open() 是一個更通用的函數,它必須弄清楚您要開啟的內容。 在此過程中,它使用作業系統功能,例如在另一個程式中開啟圖像。 img = NewImage("檔名.jpg");將打開圖像檔案並創建 JSL 圖像,並返回它的句柄。
另一個建議是您可以使用我在文件交換上編寫的另一個腳本(在圖像分析器之前),稱為影像到資料表。 與影像分析器類似,它會將您的影像轉換為資料表,但您無法獲得影像分析器的所有其餘功能。
將其包裝在循環中作為克雷格@JMP顯示(上圖),您應該可以開始了。
回覆:開啟影像 (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" ); ););回覆:開啟影像 (jpg) 文件,執行分析並移至下一個影像非常抱歉,我在原來的帖子中表達得不夠清楚。 我想要做的是將像素資訊放入資料表中,而不是原始影像本身。
這實際上是自動化影像到資料表 JSL已編寫的腳本,但會遍歷資料夾中的每個影像,並將結果資料表以及對同一資料夾中像素的任何結果分析儲存起來。
x 和 y 座標以及 RGB、I 和 HSL 足以讓我執行我需要的任何分析。 我附加了一個可以對其進行分析的範例資料表,我還附加了從中獲取該資料的原始影像,我有數千個需要檢查的資料表,因此一次執行一個將是幾乎不可能。
再次對原帖中的措辭不當和缺乏清晰度表示歉意。
大衛。
回覆:開啟影像 (jpg) 文件,執行分析並移至下一個影像新增文件類型參數。那麼傳回的值將會是一個圖片物件。即使你混合搭配 PNG、JPG、GIF,它也可能會起作用;它告訴 JMP 返回圖片,而不是使用作業系統預設的擴充功能。
開啟(“$desktop/setFont.PNG”,“PNG”)
新圖片(
字符到 Blob(
「640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
或使用newimage來取得圖片物件。
newimage("$desktop/setFont.PNG")
新圖片(
字符到 Blob(
「640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
newimage 更簡單;如果圖像是 URL 或 Blob,則可能需要 open。
回覆:開啟影像 (jpg) 文件,執行分析並移至下一個影像這應該會將資料夾中的圖像檔案放入 JMP 表中:
// ian.cox@jmp.com :2014 年 6 月 23 日
名稱預設為此處( 1 ) ;
目錄=選擇目錄( “選擇包含圖像檔案的目錄:” ) ;
清單=目錄中的文件(目錄) ;
如果( N項(清單) < 1 ,列印( “資料夾中未找到檔案” ||目錄|| “。” ) ;嘟() ;丟()) ;
dt =新表( “圖片來自” ||目錄,
新專欄( “檔案路徑” ,特點,標稱) ,
新專欄( “圖像” ,表達) ,新增行( N項(清單))
) ;
為了( F = 1 , F <=尼特姆斯(清單) , F ++,
FP =目錄|| “/” ||清單[ F ] ;
柱子( dt , “檔案路徑” )[ F ] = FP ;
嘗試(柱子( dt , “圖像” )[ F ] =新圖片( FP )) ; // 如果它不是圖像文件,請使用“Try()”
) ;