<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Re: [Insight-users] erosion performance for binary images</TITLE>
<META content="text/html; charset=iso-8859-1" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.6001.18702"></HEAD>
<BODY>
<DIV dir=ltr align=left><SPAN class=078163410-08062009><FONT color=#0000ff 
size=2 face=Arial>Hi Gaetan and Richard,</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=078163410-08062009><FONT color=#0000ff 
size=2 face=Arial></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=078163410-08062009><FONT color=#0000ff 
size=2 face=Arial>I can confirm the performance dependence on pixel type 
(compare box.us.txt with box.uc.txt for unsigned short and char). For my problem 
it's ok to use unsigned char (and also to use a box structure 
element).</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=078163410-08062009><FONT color=#0000ff 
size=2 face=Arial></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=078163410-08062009><FONT color=#0000ff 
size=2 face=Arial>Thank you guys for sharing your implementations of the binary 
contour + iterative filter and the parabolic morphology code. I&nbsp;added both 
of them to my little test program, see erosion2.zip. On my pc (WinXP, SP3, 32 
bit, Intel Core 2 Quad Q6600 @ 2.4 GHz, 4 GB RAM) I get the following 
numbers:</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=078163410-08062009><FONT color=#0000ff 
size=2 face=Arial></FONT></SPAN>&nbsp;</DIV>
<DIV dir=ltr align=left><SPAN class=078163410-08062009><FONT color=#0000ff 
size=2 face=Arial>Box radius: 1<BR>&nbsp; Elapsed time erosion VHGW 
(multi-threaded): 14.719s.<BR>&nbsp; Elapsed time contour iterative 
(multi-threaded): 0.688s.<BR>&nbsp; Elapsed time parabolic (single-threaded): 
5.094s.<BR>Box radius: 2<BR>&nbsp; Elapsed time erosion VHGW (multi-threaded): 
19.235s.<BR>&nbsp; Elapsed time contour iterative (multi-threaded): 
1.297s.<BR>&nbsp; Elapsed time parabolic (single-threaded): 5.094s.<BR>Box 
radius: 4<BR>&nbsp; Elapsed time erosion VHGW (multi-threaded): 
14.968s.<BR>&nbsp; Elapsed time contour iterative (multi-threaded): 
2.61s.<BR>&nbsp; Elapsed time parabolic (single-threaded): 5.141s.<BR>Box 
radius: 8<BR>&nbsp; Elapsed time erosion VHGW (multi-threaded): 
36.89s.<BR>&nbsp; Elapsed time contour iterative (multi-threaded): 
5.125s.<BR>&nbsp; Elapsed time parabolic (single-threaded): 5.188s.<BR>Box 
radius: 16<BR>&nbsp; Elapsed time erosion VHGW (multi-threaded): 
20.328s.<BR>&nbsp; Elapsed time contour iterative (multi-threaded): 
10.188s.<BR>&nbsp; Elapsed time parabolic (single-threaded): 5.312s.<BR>Box 
radius: 32<BR>&nbsp; Elapsed time erosion VHGW (multi-threaded): 
30.391s.<BR>&nbsp; Elapsed time contour iterative (multi-threaded): 
19.953s.<BR>&nbsp; Elapsed time parabolic (single-threaded): 
5.765s.</FONT></SPAN></DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 face=Arial>So, 
erosion based on the binary contours is very fast and the fastest up till a 
radius of 8. After that the parabolic morphology algorithm takes over with a 
very constant run time of about 5s!</FONT></SPAN></DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=078163410-08062009><FONT face=Arial><FONT color=#0000ff 
size=2>Richard, for the parabolic morphology algorithm I had to 
set:</FONT></FONT></SPAN></DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=078163410-08062009></SPAN><SPAN class=078163410-08062009><FONT 
face=Arial><FONT size=2><FONT color=#0000ff><SPAN 
class=078163410-08062009>&nbsp;&nbsp;&nbsp; p</SPAN>arabolic-&gt;SetScale( 
radii[ i ]*radii[ i ]/2 + 1 );</FONT></FONT></FONT></SPAN></DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 face=Arial>to 
get&nbsp;identical results compared with my baseline algorithm (BinaryErode), 
instead of simply setting parabolic-&gt;SetScale( radii[ i ] ), like with the 
other filters. Does this make sense to you?</FONT></SPAN></DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 face=Arial>Thanks 
again for all your feedback and sharing of this code!</FONT></SPAN></DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 
face=Arial>Regards,</FONT></SPAN></DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=078163410-08062009><FONT color=#0000ff size=2 
face=Arial>Marius</FONT></DIV>
<DIV dir=ltr align=left><FONT face=Arial><BR><FONT color=#0000ff 
size=2></FONT></FONT></DIV></SPAN><BR>
<BLOCKQUOTE 
style="BORDER-LEFT: #0000ff 2px solid; PADDING-LEFT: 5px; MARGIN-LEFT: 5px; MARGIN-RIGHT: 0px" 
dir=ltr>
  <DIV dir=ltr lang=en-us class=OutlookMessageHeader align=left>
  <HR tabIndex=-1>
  <FONT size=2 face=Tahoma><B>From:</B> Gaëtan Lehmann 
  [mailto:gaetan.lehmann@jouy.inra.fr] <BR><B>Sent:</B> Sunday, June 07, 2009 
  8:50 PM<BR><B>To:</B> Staring, M. (LKEB)<BR><B>Cc:</B> 
  insight-users@itk.org<BR><B>Subject:</B> Re: [Insight-users] erosion 
  performance for binary images<BR></FONT><BR></DIV>
  <DIV></DIV><!-- Converted from text/plain format --><BR>
  <P><FONT size=2>Hi Marius,<BR><BR>I was a bit surprised by the bad results 
  with the anchor morphology -&nbsp;<BR>it seems to be caused by the pixel type 
  used. Using unsigned char&nbsp;<BR>instead of unsigned short give those 
  results for me:<BR><BR>[glehmann@gbook src]$ ./test 
  ../post_zoom_mask.mhd<BR>Box radius: 1<BR>&nbsp;&nbsp; Elapsed time 
  erosion_binary: 8.67705s.<BR>&nbsp;&nbsp; Elapsed time erosion VHGW: 
  17.9855s.<BR>&nbsp;&nbsp; Elapsed time erosion Anchor: 26.9067s.<BR>Box 
  radius: 2<BR>&nbsp;&nbsp; Elapsed time erosion_binary: 
  9.60058s.<BR>&nbsp;&nbsp; Elapsed time erosion VHGW: 19.3998s.<BR>&nbsp;&nbsp; 
  Elapsed time erosion Anchor: 27.9886s.<BR>Box radius: 4<BR>&nbsp;&nbsp; 
  Elapsed time erosion_binary: 12.2166s.<BR>&nbsp;&nbsp; Elapsed time erosion 
  VHGW: 20.6566s.<BR>&nbsp;&nbsp; Elapsed time erosion Anchor: 28.6419s.<BR>Box 
  radius: 8<BR>&nbsp;&nbsp; Elapsed time erosion_binary: 
  20.2531s.<BR>&nbsp;&nbsp; Elapsed time erosion VHGW: 20.6925s.<BR>&nbsp;&nbsp; 
  Elapsed time erosion Anchor: 30.2072s.<BR>Box radius: 16<BR>&nbsp;&nbsp; 
  Elapsed time erosion_binary: 50.8547s.<BR>&nbsp;&nbsp; Elapsed time erosion 
  VHGW: 22.6839s.<BR>&nbsp;&nbsp; Elapsed time erosion Anchor: 31.6612s.<BR>Box 
  radius: 32<BR>&nbsp;&nbsp; Elapsed time erosion_binary: 
  156.725s.<BR>&nbsp;&nbsp; Elapsed time erosion VHGW: 27.783s.<BR>&nbsp;&nbsp; 
  Elapsed time erosion Anchor: 36.0459s.<BR><BR>I guess we have to investigate 
  what can do that…<BR><BR>I've also implemented an erosion based on 
  BinaryContourImageFilter.&nbsp;<BR>The contour filter is applied several times 
  to get the same results as&nbsp;<BR>above. You can get the code at<BR><BR><A 
  href="http://voxel.jouy.inra.fr/darcs/contrib-itk/fof/iterative.cxx">http://voxel.jouy.inra.fr/darcs/contrib-itk/fof/iterative.cxx</A><BR><A 
  href="http://voxel.jouy.inra.fr/darcs/contrib-itk/fof/itkIterativeImageFilter.h">http://voxel.jouy.inra.fr/darcs/contrib-itk/fof/itkIterativeImageFilter.h</A><BR><A 
  href="http://voxel.jouy.inra.fr/darcs/contrib-itk/fof/itkIterativeImageFilter.txx">http://voxel.jouy.inra.fr/darcs/contrib-itk/fof/itkIterativeImageFilter.txx</A><BR><BR>Here 
  are the execution times for the same box sizes as 
  above:<BR><BR>0.988033<BR>1.69216<BR>3.10681<BR>6.00902<BR>12.9424<BR>27.6227<BR><BR>That 
  implementation is faster than all the other filters, up to a&nbsp;<BR>radius 
  of 32 :-)<BR>It is much limited also, because it works only with binary 
  images, and&nbsp;<BR>the same size on all the dimensions of the 
  radius.<BR><BR>All the measures where made on a macbook air with a core 2 duo 
  at 1.8&nbsp;<BR>GHz, gcc 4.0.1, ITK 3.14, and built in Release 
  mode.<BR><BR>More input to come with separable implementations 
  :-)<BR><BR>Thanks for your feedbacks!<BR><BR>Gaëtan<BR><BR><BR><BR><BR><BR>Le 
  5 juin 09 à 18:46, &lt;M.Staring@lumc.nl&gt; &lt;M.Staring@lumc.nl&gt; a écrit 
  :<BR><BR>&gt; Hi Dan and Gaetan,<BR>&gt;<BR>&gt; First of all: thanks for your 
  feedback.<BR>&gt;<BR>&gt; I forgot about the importance of the specific choice 
  of the kernel.&nbsp;<BR>&gt; That makes sense of course. In my test code I 
  used the line<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
  erosionFilter-&gt;SetRadius( radii[ i ] );<BR>&gt;<BR>&gt; and assumed it 
  would be give a ball. Now I use:<BR>&gt;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
  erosionFilter-<BR>&gt; &gt;SetKernel( 
  itk::FlatStructuringElement&lt;Dimension&gt;::Box( radius ) );<BR>&gt; 
  or<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; erosionFilter-<BR>&gt; &gt;SetKernel( 
  itk::FlatStructuringElement&lt;Dimension&gt;::Ball( radius ) 
  );<BR>&gt;<BR>&gt; Then the VHGW filter indeed did not run for the Ball, 
  because it is&nbsp;<BR>&gt; not decomposable.<BR>&gt;<BR>&gt; The new 
  performance results for ball and box are in the attachments.&nbsp;<BR>&gt; For 
  the box the binary erode still seems to be faster up till a&nbsp;<BR>&gt; 
  radius of 8, after which the VHGW takes over. The latter is not&nbsp;<BR>&gt; 
  constant for increasing radius though.<BR>&gt;<BR>&gt; I added the source code 
  in the zip, so you can reproduce the&nbsp;<BR>&gt; results. You can also find 
  the binary image on which I did the test&nbsp;<BR>&gt; in the 
  zip.<BR>&gt;<BR>&gt; From: Gaëtan Lehmann [<A 
  href="mailto:gaetan.lehmann@jouy.inra.fr">mailto:gaetan.lehmann@jouy.inra.fr</A>]<BR>&gt; 
  The algorithm used in BinaryErodeImageFilter can't be easily<BR>&gt; 
  constrained to a zone, and so it is difficult to multithread it.<BR>&gt; If 
  you want to perform an erosion with a radius of 1 (on all the<BR>&gt; 
  dimension), BinaryContourImageFilter followed by a SubtractImageFilter<BR>&gt; 
  would be a lot faster (really) especially on a multicore system, as<BR>&gt; 
  they are both multithreaded. Some timings are available in section 3<BR>&gt; 
  of <A 
  href="http://insight-journal.com/download/viewpdf/217/2">http://insight-journal.com/download/viewpdf/217/2</A><BR>&gt;<BR>&gt; 
  I just assumed it would be, since there were multi-threaded 
  versions&nbsp;<BR>&gt; for grayscale images. But it's an entirely different 
  algorithm I&nbsp;<BR>&gt; guess.<BR>&gt; Regards,<BR>&gt; Marius<BR>&gt; 
  &lt;erosion.zip&gt;&lt;ball.txt&gt;&lt;box.txt&gt;<BR><BR>--<BR>Gaëtan 
  Lehmann<BR>Biologie du Développement et de la Reproduction<BR>INRA de 
  Jouy-en-Josas (France)<BR>tel: +33 1 34 65 29 66&nbsp;&nbsp;&nbsp; fax: 01 34 
  65 29 09<BR><A 
  href="http://voxel.jouy.inra.fr">http://voxel.jouy.inra.fr</A>&nbsp; <A 
  href="http://www.itk.org">http://www.itk.org</A><BR><A 
  href="http://www.mandriva.org">http://www.mandriva.org</A>&nbsp; <A 
  href="http://www.bepo.fr">http://www.bepo.fr</A><BR><BR></FONT></P></BLOCKQUOTE></BODY></HTML>