1 //:
2 // \file
3 // \brief Perform binary dilation on 3D images
4 // \author Tim Cootes
5 
6 #include "vil3d_binary_dilate.h"
7 #include <cassert>
8 #ifdef _MSC_VER
9 #  include "vcl_msvc_warnings.h"
10 #endif
11 
12 //: Dilates src_image to produce dest_image (assumed single plane)
vil3d_binary_dilate(const vil3d_image_view<bool> & src_image,vil3d_image_view<bool> & dest_image,const vil3d_structuring_element & element)13 void vil3d_binary_dilate(const vil3d_image_view<bool>& src_image,
14                          vil3d_image_view<bool>& dest_image,
15                          const vil3d_structuring_element& element)
16 {
17   assert(src_image.nplanes()==1);
18   unsigned ni = src_image.ni();
19   unsigned nj = src_image.nj();
20   unsigned nk = src_image.nk();
21   dest_image.set_size(ni,nj,nk,1);
22 
23   std::ptrdiff_t s_istep = src_image.istep(),  s_jstep = src_image.jstep();
24   std::ptrdiff_t s_kstep = src_image.kstep();
25   std::ptrdiff_t d_istep = dest_image.istep();
26 
27   std::vector<std::ptrdiff_t> offset;
28   vil3d_compute_offsets(offset,element,s_istep,s_jstep,s_kstep);
29 
30   // Define box in which all element will be valid
31   int ilo = -element.min_i();
32   int ihi = ni-1-element.max_i();
33   int jlo = -element.min_j();
34   int jhi = nj-1-element.max_j();
35   int klo = -element.min_k();
36   int khi = nk-1-element.max_k();
37 
38   // Deal with low i side
39   for (int i=0;i<ilo;++i)
40     for (unsigned int j=0;j<nj;++j)
41       for (unsigned int k=0;k<nk;++k)
42         dest_image(i,j,k,0)=vil3d_binary_dilate(src_image,0,element,i,j,k);
43   // Deal with high i side
44   for (unsigned int i=ihi+1;i<ni;++i)
45     for (unsigned int j=0;j<nj;++j)
46       for (unsigned int k=0;k<nk;++k)
47         dest_image(i,j,k,0)=vil3d_binary_dilate(src_image,0,element,i,j,k);
48   // Deal with low j side
49   for (int i=ilo;i<=ihi;++i)
50     for (int j=0;j<jlo;++j)
51       for (unsigned int k=0;k<nk;++k)
52         dest_image(i,j,k,0)=vil3d_binary_dilate(src_image,0,element,i,j,k);
53   // Deal with high j side
54   for (int i=ilo;i<=ihi;++i)
55     for (unsigned int j=jhi+1;j<nj;++j)
56       for (unsigned int k=0;k<nk;++k)
57         dest_image(i,j,k,0)=vil3d_binary_dilate(src_image,0,element,i,j,k);
58   // Deal with low k side
59   for (int k=0;k<klo;++k)
60     for (int i=ilo;i<=ihi;++i)
61       for (int j=jlo;j<=jhi;++j)
62         dest_image(i,j,k,0)=vil3d_binary_dilate(src_image,0,element,i,j,k);
63   // Deal with high k side
64   for (unsigned int k=khi+1;k<nk;++k)
65     for (int i=ilo;i<=ihi;++i)
66       for (int j=jlo;j<=jhi;++j)
67         dest_image(i,j,k,0)=vil3d_binary_dilate(src_image,0,element,i,j,k);
68 
69   for (int k=klo;k<=khi;++k)
70     for (int j=jlo;j<=jhi;++j)
71     {
72       const bool* src_p = &src_image(ilo,j,k);
73       bool* dest_p = &dest_image(ilo,j,k);
74 
75       for (int i=ilo;i<=ihi;++i,src_p+=s_istep,dest_p+=d_istep)
76         *dest_p=vil3d_binary_dilate(src_p,&offset[0],offset.size());
77     }
78 }
79