6
$\begingroup$

In image segmentation it is a common problem that objects appear clustered and are therefore undistinguishable from each other when using simple algorithms. Based on this post I obtained efficient ways to tackle the problem based on fast 3D distance transformation (DistanceTransform3D) and the usage of the Mathematica built-in function MaxDetect. For details please have a look at the answer of UDB in the post. Consider two simple functions to generate a test Image3D containing sphere-like objects:

generateRandomObject3D[dim_, min_, max_] := Block[
   {rdDim, rd, v, s1, s2},
   rdDim = {RandomInteger[{min, max}], RandomInteger[{min, max}], 
     RandomInteger[{min, max}]};
   rd = DiskMatrix[rdDim];
   v = dim - 2 # - 1 & /@ rdDim;
   s1 = # - RandomInteger[{1, #}] & /@ v; s2 = v - s1;
   ArrayPad[rd, MapThread[List, {s1, s2}]]
   ];

generateRandomImage3D[dim_, min_, max_, objNum_] := Block[
   {},
   Image3D[
    Plus @@ Table[generateRandomObject3D[dim, min, max], {objNum}]]
   ];

objects=generateRandomImage3D[64, 5, 5, 15];
colComps=Colorize@MorphologicalComponents@objects;

bin comps

Now we can identify the locations of the potentially clustered objects using a 3D distance transformation followed by MaxDetect.

AbsoluteTiming[MaxDetect[ImageAdjust@DistanceTransform3D[rand], 0.1]]

{1.339987, enter image description here}

As you can see this operation already takes more than one second. If I check for the runtime of the individual steps, DistanceTransform3D needs about 1/4 of the time.

Is there a faster way of doing this? The images I need to apply the algorithm to are much larger. Therefore, efficiency and runtime plays an important role in this case.

$\endgroup$

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.