JMP 함수 생성친애하는 여러분,
JMP 스크립팅에 대한 지식이 부족하여 SAS에서는 이미지 처리 측면에서 JMP에서 할 수 있는 작업을 수행할 수 없습니다.
저는 기존 JMP 스크립트를 약간 수정했습니다( 존폰테 )를 사용하면 이미지에서 RGB 데이터를 생성할 수 있습니다.
스크립트를 사용하면 하나의 이미지에 대해 이를 수행할 수 있으며 300개 이상의 이미지가 있습니다.
SAS에서는 자동화된 방식으로 매크로를 생성하는 것이 쉽지만 JMP에서는 그렇지 않습니다.
입력(이미지)과 출력(SAS 데이터 세트)은 동일한 이름을 갖습니다( 빨간색으로 ), 이는 함수에 인수가 하나만 있음을 의미합니다.
내가 처리하고 싶은 모든 이미지의 이름은 JMP 데이터 세트(열이 하나인 데이터 세트)에 저장됩니다.
스크립트는 다음과 같습니다.
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를 회색조(강도) 행렬로 변환
나는 = 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"를 사용해 보세요.
제이 (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로 대체했습니다.
나는 왜 일을 하지 않는지 이해하지 못합니다.
좋은 하루 되세요,
사미르
Re: JMP 함수 생성단 하나의 이미지 이후에 중지된 이유는 실수로 "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 버전만 해당)은 이를 하나의 데이터 세트로 직접 로드합니다. 순차적 이미지 데이터가 있는 경우 이 경로를 선택하고 이미지를 다중 이미지 파일로 패키징하는 것을 고려할 수 있습니다. 또한 이미지 아카이브를 더 쉽게 유지 관리할 수 있습니다.
중
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";
이 예에서는 두 개의 인수가 있는 사용자 함수 "processFun"을 보여주고 데이터 테이블을 읽는 루프를 보여주며 필요한 이름을 구성하는 일부 문자열 연결 연산자를 보여줍니다.
Re: JMP 함수 생성SAS와 JMP의 상대적인 범위에서 SAS가 훨씬 더 큰 시스템이라는 점은 인정하지만 JMP가 작다는 점에는 동의할 수 없습니다.다음은 원하는 작업을 수행하도록 매우 간단하게 수정된 스크립트입니다.JMP(JSL)의 언어에는 코드 생성 등이 내장되어 있기 때문에 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] )
);