이미지(jpg) 파일을 열고 분석을 수행한 후 다음 이미지로 이동합니다.저는 JMP를 사용하여 자동 이미지 처리 및 분석을 수행하는 데 매우 관심이 있으며 스크립트(John Pontes 추가 기능을 기반으로 함)와 그의 훌륭한 블로그에서 정보를 수집했습니다. John Ponte, JMP 블로그 작성자 ) 이미지에서 한 번에 하나의 이미지를 실행할 수 있지만 다음에 정말로 하고 싶은 것은 다음을 수행하는 '루핑' 스크립트를 만드는 것입니다.
- 디렉토리에 있는 .jpg 파일의 수를 계산합니다.
- 하나씩 이미지를 열고 사용 가능한 정보를 데이터 테이블에 넣습니다(저는 John Pontes 이미지 분석기 추가 기능과 스크립트를 사용하고 있습니다).
- 기본 분석(열 및 행의 평균 등)을 수행합니다.
- 이것을 jpg 파일 이름으로 저장합니다
- 파일을 닫고 다음 이미지로 이동합니다.
여기에는 여러 가지 작은 문제가 있지만 가장 큰 문제는 다음을 사용할 때입니다.
을 위한 ( 나 = 1 , 나 <= N개 품목 ( 파일 ) , 나 ++,
만약에 ( 로 끝나다 ( 파일 [ 나 ] , ".jpg" ) ,
열려 있는 ( 파일 [ 나 ] ) ;
);
열린 ( 파일 ); 다른 프로그램(변경하고 싶지 않은 기본 프로그램)에서 jpg 파일을 엽니다. 다음(또는 더 나은 경우 다른 방법)을 사용하여 JMP에서 열리도록 하려면 어떻게 해야 합니까?
img = 새 이미지 ( "thefilenameofthe.jpg" ) ;
승 = 새창 ( "영상" , 이미지) ;
그런 다음 분석을 수행하고 이 모든 것을 닫은 다음 모든 이미지가 분석될 때까지 반복할 수 있습니다.
[*스태프 Seligman의 원본 게시물을 편집합니다. 사용자 질문의 두 번째 부분이 원본 게시물에 추가되었습니다.]
많은 사과드립니다. 원래 게시물에서는 충분히 명확하지 않았습니다. 내가 원하는 것은 원본 이미지 자체가 아닌 픽셀 정보를 데이터 테이블에 넣는 것입니다.
이는 실제로 ImageToDatatable JSL 이미 작성된 스크립트이지만 폴더 내의 각 이미지를 검토하고 동일한 폴더의 픽셀에 대한 결과 분석과 함께 결과 데이터 테이블을 저장합니다.
RGB, I 및 HSL과 함께 x 및 y 좌표는 내가 필요한 분석을 수행하는 데 충분합니다. 분석을 수행할 수 있는 예제 데이터 테이블을 첨부했고, 이 데이터를 가져온 원본 이미지도 첨부했습니다. 처리해야 할 작업이 수천 개가 있으므로 한 번에 하나씩 수행하는 것은 거의 불가능합니다.
원래 게시물의 잘못된 표현과 명확성이 부족한 점에 대해 다시 한 번 사과드립니다.
문안 인사
데이비드
Re: 이미지(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부 @존폰테 :
제가 제안할 한 가지는 이미지 파일에 Open() 대신 NewImage()를 사용할 수 있다는 것입니다. Open()은 무엇을 열고 있는지 파악해야 하는 보다 일반적인 함수입니다. 이 프로세스에서는 다른 프로그램에서 이미지를 여는 것과 같은 OS 기능을 사용합니다. img = NewImage("파일명.jpg"); 이미지 파일을 열고 JSL 이미지를 생성한 후 핸들을 반환합니다.
또 다른 제안은 파일 교환에서 내가 (이미지 분석기 이전에) 수행한 다른 스크립트를 사용할 수 있다는 것입니다. ImageToDatatable . 이미지 분석기와 유사하게 이미지를 데이터 테이블로 변환하지만 이미지 분석기의 나머지 기능을 모두 얻을 수는 없습니다.
루프에 다음과 같이 포장하십시오. @Craige_Hales (위)에 표시되며 잘 진행되어야 합니다.
Re: 이미지(jpg) 파일을 열고 분석을 수행한 후 다음 이미지로 이동합니다.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />방금 이 게시물을 보고 여전히 도움이 될 수 있도록 몇 가지 사항을 추가하고 싶다고 생각했습니다.
제가 제안할 한 가지는 이미지 파일에 Open() 대신 NewImage()를 사용할 수 있다는 것입니다. Open()은 열려는 항목을 파악해야 하는 보다 일반적인 함수입니다. 이 프로세스에서는 다른 프로그램에서 이미지를 여는 것과 같은 OS 기능을 사용합니다. img = NewImage("파일명.jpg"); 이미지 파일을 열고 JSL 이미지를 생성한 후 핸들을 반환합니다.
또 다른 제안은 파일 교환에서 내가 (이미지 분석기 이전에) 수행한 다른 스크립트를 사용할 수 있다는 것입니다. ImageToDatatable . 이미지 분석기와 유사하게 이미지를 데이터 테이블로 변환하지만 이미지 분석기의 나머지 기능을 모두 얻을 수는 없습니다.
루프에 다음과 같이 포장하십시오. 크레이지@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 이미 작성된 스크립트이지만 폴더 내의 각 이미지를 검토하고 동일한 폴더의 픽셀에 대한 결과 분석과 함께 결과 데이터 테이블을 저장합니다.
RGB, I 및 HSL과 함께 x 및 y 좌표는 내가 필요한 분석을 수행하는 데 충분합니다. 분석을 수행할 수 있는 예제 데이터 테이블을 첨부했고, 이 데이터를 가져온 원본 이미지도 첨부했습니다. 처리해야 할 작업이 수천 개가 있으므로 한 번에 하나씩 수행하는 것은 거의 불가능합니다.
원래 게시물의 잘못된 표현과 명확성이 부족한 점에 대해 다시 한 번 사과드립니다.
데이비드.
Re: 이미지(jpg) 파일을 열고 분석을 수행한 후 다음 이미지로 이동합니다.파일 유형 매개변수를 추가합니다.그러면 반환된 값은 그림 객체가 됩니다.PNG, JPG, GIF를 혼합하여 일치시키는 경우에도 작동할 것입니다. 이는 확장에 대한 OS 기본 프로그램으로 돌아가지 않고 그림을 반환하도록 JMP에 지시합니다.
open("$desktop/setFont.PNG","PNG")
새 이미지(
문자를 Blob(
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
또는 newimage를 사용하여 그림 개체를 가져옵니다.
newimage("$desktop/setFont.PNG")
새 이미지(
문자를 Blob(
"640745eJxkugdUU0v3PgyCIFKiotKDCsL10ovUEFBQRJodKQJKLyF0gpSIKIjSpEgnCgoqVVrooRk6obcACUaaG...
newimage가 더 간단합니다. 이미지가 URL 또는 Blob인 경우 open이 필요할 수 있습니다.
Re: 이미지(jpg) 파일을 열고 분석을 수행한 후 다음 이미지로 이동합니다.이렇게 하면 폴더의 이미지 파일이 JMP 테이블에 저장됩니다.
// ian.cox@jmp.com :2014년 6월 23일
이름의 기본값은 여기에 있습니다. ( 1 ) ;
디렉토리 = 디렉토리 선택 ( "이미지 파일이 포함된 디렉터리를 선택하세요." ) ;
fList = 파일인디렉토리 ( 디렉토리 ) ;
만약에 ( N항목 ( fList ) < 1 , 인쇄 ( "폴더에 파일이 없습니다" || 디렉토리 || "." ) ; 삑 하는 소리 () ; 던지다 ()) ;
dt = 새 테이블 ( "의 이미지" || 디렉토리 ,
새열 ( "파일 경로" , 성격 , 명사 같은 ) ,
새열 ( "영상" , 표현 ) , 행 추가 ( N항목 ( fList ))
) ;
~을 위한 ( 에프 = 1 , 에프 <= 니템 ( fList ) , 에프 ++,
fp = 디렉토리 || "/" || fList [ 에프 ] ;
열 ( dt , "파일 경로" )[ 에프 ] = fp ;
노력하다 ( 열 ( dt , "영상" )[ 에프 ] = 새 이미지 ( fp )) ; // 이미지 파일이 아닌 경우 'Try()'를 사용합니다.
) ;