【发布时间】:2018-01-11 09:22:39
【问题描述】:
这是问题here 的延续。
我重新发布one of the answers 以保持主题更清晰。
原始问题(和后续问题)来自user6406828。
尝试执行一些(循环)粒子分析时,不时会抛出一些错误。这段代码有什么可以改进的?
这里有一些代码:
// $BACKGROUND$
number useBadImage, stopAtSrcImage // flags for test
image histogram, src, stack
taggroup imgLst
number i, imgCt,imgID,x0,y0,x1,y1, z1
if (OkCancelDialog("Generate a bad image?")) useBadImage=1
else useBadImage=0
if (OkCancelDialog("Stop at testing image generation?")) stopAtSrcImage=1
else stopAtSrcImage=0
x0=128;y0=128
x1=512;y1=512
image img:=exprSize(x0,y0,0)
z1=10
stack:=exprSize(x1,y1,z1)
img=random()*100
src:=exprSize(x1,y1,0)
if (useBadImage) {
src=img.warp(icol*x0/x1,irow*y0/y1)
for (i=0;i<z1;i++) {
stack[0,0,i,x1,y1,i+1]=src+10
}
}
else {
src=sin(icol/pi())+cos(irow/pi())
for (i=0;i<z1;i++) {
stack[0,0,i,x1,y1,i+1]=src+0.1
}
}
if (stopAtSrcImage) {
src.showImage()
exit(0)
}
void doThreshold(image histogram, number PctOffPeak, number AdditionalShift) {
number max, lf,rt,maxX,maxY, i, val, threshold,d0,d1
ROI r = NewROI(); // foreground ROI
histogram.getSize(d0,d1)
//histogram[0,0,1,5]=0 //remove zero peak
max=histogram.max(maxX,maxY)
threshold=max*PctOffPeak/100
//okdialog("After trim zero peak, maxX=" +maxX)
lf=0;rt=d0
for (i=maxX;i<d0;i++) {
val=histogram.getPixel(i,0)
if (val<=threshold) {
lf=i
i=d0
}
}
lf=lf+AdditionalShift
r.ROISetRange(lf,rt);
histogram.ImageGetImageDisplay(0).ImageDisplayAddRoi(r);
}
//main loop
for (i=0;i<z1;i++) {
src:=stack[0,0,i,x1,y1,i+1].imageclone()
src.showImage()
ChooseMenuItem( "Analysis", "Particles", "Start Threshold" )
histogram := GetFrontImage();
doThreshold(histogram, 20,2)
if( !_FloatingModelessDialog( "Adjust threshold level","Proceed!" ) ) {; histogram.deleteimage(); exit(0); };
else {
src.showImage()
delay(60)
ChooseMenuItem( "Analysis", "Particles", "Remove Edge Particles" )
delay(60)
ChooseMenuItem( "Analysis", "Particles", "Find Particles" )
delay(60)
ChooseMenuItem( "Analysis", "Particles", "Analyze Particles" )
delay(60)
histogram.deleteImage()
}
}
如果选择“useBadImage”和“stopAtSrcImage”,则显示第一个 src 图像。对于粒子分析来说,这将是一个非常糟糕的问题。 UI 操作会产生多个“invalid index”错误(尝试在直方图中选择前 15% 的强度)。如果 useBadImage==0,则图像表现更好。
我扩展代码以通过图像堆栈运行一些循环。对于具有“好”图像的图像堆栈,手动粒子分析可以顺利通过所有层而没有问题,但循环几乎总是在循环中的某处生成“异常”(显示在结果窗口中)。似乎增加长时间的延迟没有帮助。但是毫不拖延地肯定会使循环崩溃。
doThreshold(image histogram, number PctOffPeak, number AdditionalShift) 被假设为“在直方图中找到最大值,从那里开始,向右走峰值的某个百分比,添加 AdditionalShift,并在那里设置 ROI 范围的“lf”值。但这并不总是表现为预计。
【问题讨论】: