打开图像 (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()”
) ;