我:在 Matlab 中执行 imageJ (Fiji) 宏直到结束
MIJ: execute imageJ (Fiji) macro until end in Matlab
我正在使用 MIJ 在 Matlab 中执行 ImageJ 宏。该宏必须在 "for" 循环中执行多次。问题是 Matlab 不会等到宏结束。最初我用 "while" 循环解决了这个问题,检查从宏生成的 "Results" table 是否为空。但是,它只是第一次解决了问题,然后从第二次开始 "Results" table 不再是空的了。
我也想过在宏的末尾生成一个变量,并用它来检查宏是否完成,但我不知道如何在 Matlab 中读取它。
你对我如何解决这个问题有什么建议吗?
非常感谢,
阿莱西亚
这是我的代码示例:
javaaddpath 'C:/Program Files/MATLAB/R2019a_x64/java/ij.jar'
javaaddpath 'C:/Program Files/MATLAB/R2019a_x64/java/mij.jar'
MIJ.start('C:/fiji-win64/Fiji.app/plugins');
IJ=ij.IJ();
macro_path=...
'C:/Macro_waterinoil.ijm';
for pos=1:16
im = mijread(strcat('E:/droplets.tif'));
figure(1)
imshow(im,[0 255])
IJ.runMacroFile(java.lang.String(macro_path));
res_Hough=0;
res_Hough=MIJ.getResultsTable();
while res_Hough==0;
res_Hough=MIJ.getResultsTable();
end
im_res=MIJ.getCurrentImage();
MIJ.run('Clear Results');
MIJ.run('Close All');
end
编辑:忽略下面的内容,我走在正确的轨道上,但没有给予应有的关注。我认为这个问题是在您将 res_Hough 设置为 0 之后的行(即 res_Hough=MIJ.getResultsTable();)。尝试删除它,以便下一行是 while 循环,然后我们可以检查输出,看看下面是否也适用
如果我没理解错的话,您是在使用 while 循环不断 ping 直到 table 已满,然后将这些值存储在 res_Hough 中,对吗?我想知道这是否是 ImageJ/FIJI 固有的限制。我认为可能是这种情况的原因是,对您的问题的一个非常简单的解释是 table 保留了以前的值,因此在第一个循环之后将始终为满,除非以某种方式手动清除。你认为会是这样吗?也许在 while 循环之后添加一个 print 语句,看看它是否在 for 循环期间打印相同的值。
我想接下来要做的就是不管上述情况如何,我都要真正尝试提供一个解决方案。我的想法是尝试让 while 循环检查前一次迭代的 table 值,直到它们不同,然后存储更新后的值。那有意义吗?类似于:
while (res_Hough[i]==0) or (res_Hough[i-1]==MIJ.getResultsTable());
res_Hough[i]=MIJ.getResultsTable();
其中 i 通过 for 循环递增
我正在使用 MIJ 在 Matlab 中执行 ImageJ 宏。该宏必须在 "for" 循环中执行多次。问题是 Matlab 不会等到宏结束。最初我用 "while" 循环解决了这个问题,检查从宏生成的 "Results" table 是否为空。但是,它只是第一次解决了问题,然后从第二次开始 "Results" table 不再是空的了。 我也想过在宏的末尾生成一个变量,并用它来检查宏是否完成,但我不知道如何在 Matlab 中读取它。
你对我如何解决这个问题有什么建议吗?
非常感谢, 阿莱西亚
这是我的代码示例:
javaaddpath 'C:/Program Files/MATLAB/R2019a_x64/java/ij.jar'
javaaddpath 'C:/Program Files/MATLAB/R2019a_x64/java/mij.jar'
MIJ.start('C:/fiji-win64/Fiji.app/plugins');
IJ=ij.IJ();
macro_path=...
'C:/Macro_waterinoil.ijm';
for pos=1:16
im = mijread(strcat('E:/droplets.tif'));
figure(1)
imshow(im,[0 255])
IJ.runMacroFile(java.lang.String(macro_path));
res_Hough=0;
res_Hough=MIJ.getResultsTable();
while res_Hough==0;
res_Hough=MIJ.getResultsTable();
end
im_res=MIJ.getCurrentImage();
MIJ.run('Clear Results');
MIJ.run('Close All');
end
编辑:忽略下面的内容,我走在正确的轨道上,但没有给予应有的关注。我认为这个问题是在您将 res_Hough 设置为 0 之后的行(即 res_Hough=MIJ.getResultsTable();)。尝试删除它,以便下一行是 while 循环,然后我们可以检查输出,看看下面是否也适用
如果我没理解错的话,您是在使用 while 循环不断 ping 直到 table 已满,然后将这些值存储在 res_Hough 中,对吗?我想知道这是否是 ImageJ/FIJI 固有的限制。我认为可能是这种情况的原因是,对您的问题的一个非常简单的解释是 table 保留了以前的值,因此在第一个循环之后将始终为满,除非以某种方式手动清除。你认为会是这样吗?也许在 while 循环之后添加一个 print 语句,看看它是否在 for 循环期间打印相同的值。
我想接下来要做的就是不管上述情况如何,我都要真正尝试提供一个解决方案。我的想法是尝试让 while 循环检查前一次迭代的 table 值,直到它们不同,然后存储更新后的值。那有意义吗?类似于:
while (res_Hough[i]==0) or (res_Hough[i-1]==MIJ.getResultsTable());
res_Hough[i]=MIJ.getResultsTable();
其中 i 通过 for 循环递增