区域在DM中成长

时间:2017-10-26 09:12:30

标签: dm-script

有没有人知道在DM中执行区域增长的任何更快的方式? 我有类似于以下示例中的测试图像的粒子图像, 每个颗粒在颗粒内具有较小强度的区域。 我希望生长这些最低强度区域以满足整个粒子的边界。 这个脚本使用扩张和 如果一个人放x = 1024或2048,那就太慢了......

编辑:

我手边知道seg图像。但我不知道如何实现目标 使用简单的tert()命令得到结果,因为不同的粒子具有不同的值。次区域的想法可能会奏效,这需要粒子计数。有一个菜单命令"分析粒子"这可以做到这一点,但怎么可能 这可以快速脚本完成吗? 这是一个实际的例子:

enter image description hereExternal 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)

3 个答案:

答案 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;用于使该粒子变暗并返回循环的功能。