00001 #ifndef vil3d_abs_shuffle_distance_txx_
00002 #define vil3d_abs_shuffle_distance_txx_
00003
00004
00005
00006
00007
00008 #include "vil3d_abs_shuffle_distance.h"
00009 #include <vcl_cassert.h>
00010
00011
00012
00013
00014
00015
00016
00017 template <class T1, class T2>
00018 double vil3d_abs_shuffle_distance(const vil3d_image_view<T1>& image1,
00019 const vil3d_image_view<T2>& image2,
00020 const vil3d_structuring_element& element,
00021 bool include_borders)
00022 {
00023
00024 unsigned ni = image1.ni();
00025 unsigned nj = image1.nj();
00026 unsigned nk = image1.nk();
00027
00028 assert(image1.nplanes()==1);
00029 assert(image2.nplanes()==1);
00030 assert(image2.ni()==ni);
00031 assert(image2.nj()==nj);
00032 assert(image2.nk()==nk);
00033
00034 vcl_ptrdiff_t istep1 = image1.istep(), jstep1 = image1.jstep(), kstep1 = image1.kstep(),
00035 istep2 = image2.istep(), jstep2 = image2.jstep(), kstep2 = image2.kstep();
00036
00037 vcl_vector<vcl_ptrdiff_t> offset;
00038 vil3d_compute_offsets(offset, element, istep1, jstep1, kstep1);
00039
00040
00041 int ilo = -element.min_i();
00042 int ihi = ni-1-element.max_i();
00043 int jlo = -element.min_j();
00044 int jhi = nj-1-element.max_j();
00045 int klo = -element.min_k();
00046 int khi = nk-1-element.max_k();
00047
00048 double sum=0.0;
00049
00050 if (include_borders)
00051 {
00052
00053 for (unsigned int i=0; int(i)<ilo; ++i)
00054 for (unsigned int j=0; j<nj; ++j)
00055 for (unsigned int k=0; k<nk; ++k)
00056 sum+=vil3d_abs_shuffle_distance(image1(i,j,k),image2,0,element,i,j,k);
00057
00058 for (unsigned int i=ihi+1; i<ni; ++i)
00059 for (unsigned int j=0;j<nj;++j)
00060 for (unsigned int k=0; k<nk; ++k)
00061 sum+=vil3d_abs_shuffle_distance(image1(i,j,k),image2,0,element,i,j,k);
00062
00063
00064 for (unsigned int i=ilo; int(i)<=ihi; ++i)
00065 for (unsigned int j=0; int(j)<jlo; ++j)
00066 for (unsigned int k=klo; int(k)<khi; ++k)
00067 sum+=vil3d_abs_shuffle_distance(image1(i,j,k),image2,0,element,i,j,k);
00068
00069 for (unsigned int i=ilo; int(i)<=ihi; ++i)
00070 for (unsigned int j=jhi+1; j<nj; ++j)
00071 for (unsigned int k=klo; int(k)<khi; ++k)
00072 sum+=vil3d_abs_shuffle_distance(image1(i,j,k),image2,0,element,i,j,k);
00073
00074
00075 for (unsigned int i=ilo; int(i)<=ihi; ++i)
00076 for (unsigned int j=jlo; int(j)<jhi; ++j)
00077 for (unsigned int k=0; int(k)<klo; ++k)
00078 sum+=vil3d_abs_shuffle_distance(image1(i,j,k),image2,0,element,i,j,k);
00079
00080 for (unsigned int i=ilo; int(i)<=ihi; ++i)
00081 for (unsigned int j=jlo; int(j)<jhi; ++j)
00082 for (unsigned int k=khi+1; k<nk; ++k)
00083 sum+=vil3d_abs_shuffle_distance(image1(i,j,k),image2,0,element,i,j,k);
00084 }
00085
00086 const T1* image1_start = image1.origin_ptr();
00087 const T2* image2_start = image2.origin_ptr();
00088
00089 for (unsigned int k=klo; int(k)<=khi; ++k)
00090 for (unsigned int j=jlo; int(j)<=jhi; ++j)
00091 {
00092 const T1* p1 = image1_start + k*kstep1 + j*jstep1 + ilo*istep1;
00093 const T2* p2 = image2_start + k*kstep2 + j*jstep2 + ilo*istep2;
00094
00095 for (int i=ilo; i<=ihi; ++i,p1+=istep1,p2+=istep2)
00096 sum += vil3d_abs_shuffle_distance(*p1,p2,&offset[0],offset.size());
00097 }
00098
00099
00100 int np = ni*nj*nk;
00101 if (!include_borders) np = (1+ihi-ilo)*(1+jhi-jlo)*(1+khi-klo);
00102
00103 return sum/np;
00104 }
00105
00106 #undef VIL3D_ABS_SHUFFLE_DISTANCE_INSTANTIATE
00107 #define VIL3D_ABS_SHUFFLE_DISTANCE_INSTANTIATE( T1, T2 ) \
00108 template double vil3d_abs_shuffle_distance(const vil3d_image_view< T1 >& image1, \
00109 const vil3d_image_view< T2 >& image2, \
00110 const vil3d_structuring_element& element, \
00111 bool include_borders)
00112
00113 #endif // vil3d_abs_shuffle_distance_txx_