有没有人知道在DM中执行区域增长的任何更快的方式? 我有类似于以下示例中的测试图像的粒子图像, 每个颗粒在颗粒内具有较小强度的区域。 我希望生长这些最低强度区域以满足整个粒子的边界。 这个脚本使用扩张和 如果一个人放x = 1024或2048,那就太慢了......
编辑:
我手边知道seg图像。但我不知道如何实现目标 使用简单的tert()命令得到结果,因为不同的粒子具有不同的值。次区域的想法可能会奏效,这需要粒子计数。有一个菜单命令"分析粒子"这可以做到这一点,但怎么可能 这可以快速脚本完成吗? 这是一个实际的例子:
(External Link for full res TIF (DropBox))
例如,最大的粒子将具有完整的值29,即该粒子中的最小数量。 我还编辑了代码以使用正面图像。
// $BACKGROUND$
image front:=getfrontimage()
image newfront = front
number x,y,i,su,su1,val=14,ok=1,count = 0,min,max,z,j,mmax=0
getsize(front,x,y)
image seg := binaryimage("",x,y)
image new := binaryimage("",x,y)
image mp:= binaryimage("",x,y)
minmax(front,min,max)
image front1 = front
seg=tert(front1>0,1,0)
for(i=1;i<=max;i++)
{
new=tert(front1==i,1,0)
su = sum(new)
result(" int "+i+" of "+max+" \n")
while(ok)
{
mp = MPdilate( new ,7)
mp = mp*seg
if(sum(mp)==su) ok=0
su = sum(mp)
count++
new=mp
}
ok=1
front1 = tert(new>0,i,front1)
}
showimage(front1)
答案 0 :(得分:0)
这可能不是你想要的,但你的“目标”对我来说仍然不是100%清楚。从你到目前为止的问题来看,似乎你只想要你的面具的二进制图像,你可以通过将所有0值图像保持为零并将所有其他图像设置为1来获得。可以通过叔或只是一个双“不”:
image src := GetFrontImage()
image binMask = !!src
binMask.SetName( "Binary" )
binMask.ShowImage()
然而,我猜你的真正目标是为每个个体粒子自己获取这些二元模板,即获得10个二元模板只显示一个粒子,当你有10个不同(空间分离)时粒子。这是一个有点不同的任务。
答案 1 :(得分:0)
在你的帖子中,你似乎在说'&34;粒子分析&#34;可能已经做了你想做的事情,所以你的问题的一个解决方案可能是立即使用粒子分析!
不幸的是,脚本API目前无法正确访问该部分软件。然而,有一点开箱即用的&#39;开箱即用&#39;思考和一些黑客技能,可以通过使用与UI相关的命令ChooseMenuItem()
我在下面发布了一个小小的例子,我刚刚一起入侵了。它首先对二进制输入图像进行阈值处理,然后应用默认的粒子分析,然后抓取结果图像并利用包含的信息来裁剪粒子。
请原谅编码,但您可以根据需要修改此脚本。
number GetMeasurementsColumnIndex( image input, string colLabel )
{
// Basic checks... return <0 if fail.
if ( !input.ImageIsValid() ) return -1
if ( input.GetName() != "Measurements" ) return -2
if ( 0 == input.ImageCountImageDisplays() ) return -3
imageDisplay disp = input.ImageGetImageDisplay( 0 )
number sx = input.ImageGetDimensionSize( 0 )
for( number c = 0; c<sx; c++ )
if ( colLabel == disp.SpreadsheetImageDisplayGetColumnLabel(c) )
return c
return -4 // not found
}
// Main Script (Test)
number bOnNewWorkSpace = 1
// Pre-#1: Ensure relevant information is computed by particle Anlaysis
// The info is stored in the tags, but it seems it is only read from there
// on start-up... (needs checking)
GetPersistentTagGroup().TagGroupSetTagAsBoolean( "Private:Particles:Configuration:Length", 0 )
GetPersistentTagGroup().TagGroupSetTagAsBoolean( "Private:Particles:Configuration:Width", 1 )
GetPersistentTagGroup().TagGroupSetTagAsBoolean( "Private:Particles:Configuration:CenterX", 1 )
GetPersistentTagGroup().TagGroupSetTagAsBoolean( "Private:Particles:Configuration:CenterY", 1 )
// #1 Act on binary image mask based on front-image (temp)
image source := GetFrontImage()
image binSrc = !!source
// #2 Potentially work on "clean" workspace
if ( bOnNewWorkSpace )
{
number wsID_src = WorkSpaceGetActive()
number wsID_results = WorkSpaceAdd( WorkSpaceGetIndex(wsID_src) + 1 )
WorkSpaceSetActive( wsID_results )
}
// #3 Treshold the mask by script. (Requires display)
binSrc.ShowImage()
imageDisplay disp = binSrc.ImageGetImageDisplay( 0 )
disp.RasterImageDisplaySetThresholdOn( 1 )
disp.RasterImageDisplaySetThresholdLimits( 0.1, 1 )
// #4 Perform Particle analysis, grab results, close temp. source
ChooseMenuItem( "Analysis", "Particles", "Analyze Particles" )
binSrc.DeleteImage()
image particleList := GetFrontImage()
// #5 Perfrom checks on results before proceeding.
// (Particle Analysis may be configured by script by modifying persistent tags. See pre-step #1)
number pxIndex = GetMeasurementsColumnIndex( particleList, "CenterX" )
number pyIndex = GetMeasurementsColumnIndex( particleList, "CenterY" )
number pRIndex = GetMeasurementsColumnIndex( particleList, "MaxRadii" )
if ( pxIndex < 0 ) Throw( "Need to setup Analysis to create 'CenterX' output." )
if ( pyIndex < 0 ) Throw( "Need to setup Analysis to create 'CenterY' output." )
if ( pRIndex < 0 ) Throw( "Need to setup Analysis to create 'MaxRadii' output." )
// #6 Use results. Example Create Individual crops from source
// ( This may still include intruding pixels from neighboring particles )
number nParticles = particleList.ImageGetDimensionSize( 1 )
nParticles = 5 // for testing...
for( number p = 0; p<nParticles; p++ )
{
number px = particleList.GetPixel( pxIndex, p )
number py = particleList.GetPixel( pyIndex, p )
number pR = particleList.GetPixel( pRIndex, p )
number y0 = py - pr
number x0 = px - pr
image crop := source.Slice2( x0,y0,0, 0,pR*2,1, 1,pR*2,1).ImageClone()
crop.ShowImage()
}
答案 2 :(得分:0)
您可能希望获得每个粒子的像素坐标。要存储它,您需要创建标记列表的标记列表。从BeMyGuest的简洁代码开始,您可以这样做:
image source := GetFrontImage()
image binSrc = !!source
taggroup tgPartcleList=newTagList()
taggroup tgParticleIndividual=newTagList()
number val, x, y
while (1) {
val=binSrc.max(x, y)
if (val==0) break
else {
tgParticleIndividual=dfs(binSrc, x, y)
}
tgPartcleList.taggroupInsertTagAsTagGroup(infinity(), tgParticleIndividual)
turnOffpixels(binSrc, tgParticleIndividual)
}
dfs功能是&#34;深度优先搜索&#34;。基本上,它是一种&#34;链接组件搜索&#34;。它有很多算法。我使用&#34;深度优先&#34;,可以使用taggroup模拟的堆栈结构进行编码。 在每个dfs之后,你打电话给&#34; turnOffpixels&#34;用于使该粒子变暗并返回循环的功能。