core/vil1/vil1_memory_image_window.cxx

Go to the documentation of this file.
00001 // This is core/vil1/vil1_memory_image_window.cxx
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005 //:
00006 // \file
00007 // \author Andrew W. Fitzgibbon, Oxford RRG
00008 // \date   19 Aug 96
00009 //-----------------------------------------------------------------------------
00010 
00011 #include "vil1_memory_image_window.h"
00012 #include <vcl_cmath.h>
00013 
00014 vil1_memory_image_window::vil1_memory_image_window(
00015            const vil1_memory_image_of<vxl_byte>& image,
00016            int centre_x, int centre_y, int mask_size):
00017   image1_(image)
00018 {
00019   init(centre_x, centre_y, mask_size);
00020 }
00021 
00022 void vil1_memory_image_window::init(int centre_x, int centre_y, int mask_size)
00023 {
00024   mask_size_ = mask_size;
00025   centre1_x_ = centre_x;
00026   centre1_y_ = centre_y;
00027   mask1_col_index_ = centre_x - mask_size_ / 2;
00028   mask1_row_index_ = centre_y - mask_size_ / 2;
00029 }
00030 
00031 float vil1_memory_image_window::mean_intensity()
00032 {
00033   int tot = 0;
00034   for (int row_index = 0; row_index < mask_size_; row_index++)
00035     for (int col_index = 0; col_index < mask_size_; col_index++)
00036       tot += image1_(mask1_col_index_ +col_index, mask1_row_index_ +row_index);
00037   return (float)tot / (float)(mask_size_ * mask_size_);
00038 }
00039 
00040 inline int labs(int x) { return (x > 0) ? x : -x; }
00041 
00042 //:Return early if difference becomes greater than early_exit_level.
00043 // This is a useful check to have anyway as the default arg of MAXINT avoids
00044 // accumulator overflow which can easily happen on certain medical and range
00045 // images.
00046 int vil1_memory_image_window::sum_abs_diff(const vil1_memory_image_of<vxl_byte>& image2,
00047                                            int centre2_x, int centre2_y,
00048                                            int early_exit_level)
00049 {
00050   int mask2_col_index = centre2_x - mask_size_ / 2;
00051   int mask2_row_index = centre2_y - mask_size_ / 2;
00052 
00053   // make sure that we don't ask for pixels outside the image - PVr, 1 dec. 1997
00054   int row_start = 0;
00055   if (row_start < -mask1_row_index_) row_start = -mask1_row_index_;
00056   if (row_start < -mask2_row_index) row_start = -mask2_row_index;
00057   int row_end = mask_size_;
00058   if (row_end >= int(image1_.width())-mask1_row_index_) row_end = image1_.width()-mask1_row_index_-1;
00059   if (row_end >= int(image2.width())-mask2_row_index) row_end = image2.width()-mask2_row_index-1;
00060   int col_start = 0;
00061   if (col_start < -mask1_col_index_) col_start = -mask1_col_index_;
00062   if (col_start < -mask2_col_index) col_start = -mask2_col_index;
00063   int col_end = mask_size_;
00064   if (col_end >= int(image1_.width())-mask1_col_index_) col_end = image1_.width()-mask1_col_index_-1;
00065   if (col_end >= int(image2.width())-mask2_col_index) col_end = image2.width()-mask2_col_index-1;
00066 
00067   int difference_total = 0;
00068   for (int row_index = row_start; row_index < row_end; row_index++)
00069     for (int col_index = col_start; col_index < col_end; col_index++)
00070     {
00071       int p1 = image1_(mask1_col_index_ + col_index, mask1_row_index_ + row_index);
00072       int p2 =  image2( mask2_col_index + col_index,  mask2_row_index + row_index);
00073 
00074       difference_total += p1>p2 ? p1-p2 : p2-p1; // avoid vnl dependency - PVr
00075 
00076       // Check to see if we can return early -- this is also useful as it implicitly
00077       // avoids accumulator overflow.
00078       if (difference_total > early_exit_level)
00079         return difference_total;
00080     }
00081   return difference_total;
00082 }
00083 
00084 //:Return early if difference becomes greater than early_exit_level.
00085 // This is a useful check to have anyway as the default arg of MAXINT avoids
00086 // accumulator overflow which can easily happen on certain medical and range
00087 // images.
00088 int vil1_memory_image_window::sum_sqr_diff(const vil1_memory_image_of<vxl_byte>& image2,
00089                                            int centre2_x, int centre2_y,
00090                                            int early_exit_level)
00091 {
00092   int mask2_col_index = centre2_x - mask_size_ / 2;
00093   int mask2_row_index = centre2_y - mask_size_ / 2;
00094 
00095   // make sure that we don't ask for pixels outside the image - PVr, 1 dec. 1997
00096   int row_start = 0;
00097   if (row_start < -mask1_row_index_) row_start = -mask1_row_index_;
00098   if (row_start < -mask2_row_index) row_start = -mask2_row_index;
00099   int row_end = mask_size_;
00100   if (row_end >= int(image1_.width())-mask1_row_index_) row_end = image1_.width()-mask1_row_index_-1;
00101   if (row_end >= int(image2.width())-mask2_row_index) row_end = image2.width()-mask2_row_index-1;
00102   int col_start = 0;
00103   if (col_start < -mask1_col_index_) col_start = -mask1_col_index_;
00104   if (col_start < -mask2_col_index) col_start = -mask2_col_index;
00105   int col_end = mask_size_;
00106   if (col_end >= int(image1_.width())-mask1_col_index_) col_end = image1_.width()-mask1_col_index_-1;
00107   if (col_end >= int(image2.width())-mask2_col_index) col_end = image2.width()-mask2_col_index-1;
00108 
00109   int difference_total = 0;
00110   for (int row_index = row_start; row_index < row_end; row_index++)
00111     for (int col_index = col_start; col_index < col_end; col_index++)
00112     {
00113       int p1 = image1_(mask1_col_index_ + col_index, mask1_row_index_ + row_index);
00114       int p2 =  image2( mask2_col_index + col_index,  mask2_row_index + row_index);
00115 
00116       difference_total += (p1-p2)*(p1-p2);
00117 
00118       // Check to see if we can return early -- this is also useful as it implicitly
00119       // avoids accumulator overflow.
00120       if (difference_total > early_exit_level)
00121         return difference_total;
00122     }
00123   return difference_total;
00124 }
00125 
00126 
00127 int vil1_memory_image_window::normalised_sum_abs_diff(const vil1_memory_image_of<vxl_byte>& image2,
00128                                                       int centre2_x, int centre2_y,
00129                                                       double normalise_ratio,
00130                                                       int early_exit_level)
00131 {
00132   int mask2_col_index = centre2_x - mask_size_ / 2;
00133   int mask2_row_index = centre2_y - mask_size_ / 2;
00134 
00135   int difference_total = 0;
00136   for (int row_index = 0; row_index < mask_size_; row_index++)
00137     for (int col_index = 0; col_index < mask_size_; col_index++)
00138     {
00139       int p1 = image1_(mask1_col_index_ + col_index, mask1_row_index_ + row_index);
00140       int p2 =  image2( mask2_col_index + col_index,  mask2_row_index + row_index);
00141       difference_total += labs (p1 - (int) (normalise_ratio * (float) p2));
00142 
00143       if (difference_total > early_exit_level)
00144         return difference_total;
00145     }
00146 
00147   return difference_total;
00148 }
00149 
00150 
00151 double vil1_memory_image_window::normalised_cross_correlation(const vil1_memory_image_of<vxl_byte>& image2,
00152                                                               int centre2_x, int centre2_y)
00153 {
00154   // set mask size
00155   int n = (int)mask_size_/2;
00156   int m = (int)mask_size_/2;
00157 
00158 
00159   //////////////////////////////////////////////
00160   // setup the integer locations of the
00161   // points
00162   //
00163   int u1 = centre1_x_;
00164   int v1 = centre1_y_;
00165   int u2 = centre2_x;
00166   int v2 = centre2_y;
00167 
00168   // indices
00169   int i,j;
00170 
00171   double average_I1_uv;
00172   double average_I2_uv;
00173 
00174   //////////////////////////////////////////////
00175   // calculate the average intensities
00176   //
00177 
00178   average_I1_uv = 0;
00179   average_I2_uv = 0;
00180 
00181   for (i = -n; i < n+1; i++) {
00182     for (j = -m; j < m+1; j++) {
00183       average_I1_uv += image1_(u1+i,v1+j);
00184       average_I2_uv +=  image2(u2+i,v2+j);
00185     }
00186   }
00187 
00188   average_I1_uv /= ((2*n + 1)*(2*m + 1));
00189   average_I2_uv /= ((2*n + 1)*(2*m + 1));
00190 
00191   //////////////////////////////////////////////
00192   // calculate the std. deviations
00193   //
00194 
00195   double result_I1 = 0;
00196   double result_I2 = 0;
00197 
00198   for (i = -n; i < n+1; i++) {
00199     for (j = -m; j < m+1; j++) {
00200       double I1_uv = image1_(u1+i,v1+j);
00201       result_I1 += (I1_uv - average_I1_uv ) * (I1_uv - average_I1_uv);
00202 
00203       double I2_uv = image2(u2+i,v2+j);
00204       result_I2 += (I2_uv - average_I2_uv ) * (I2_uv - average_I2_uv);
00205     }
00206   }
00207 
00208   double std_dev_I1_uv = vcl_sqrt(result_I1);
00209   double std_dev_I2_uv = vcl_sqrt(result_I2);
00210 
00211   ///////////////////////////////////////
00212   // calculate the correlation score
00213   // again using result as a temporary
00214   //  variable
00215 
00216   double result = 0;
00217 
00218   for (i = -n; i < n+1; i++)
00219   {
00220     for (j = -m; j < m+1; j++)
00221     {
00222       double I1_uv;
00223       double I2_uv;
00224 
00225       I1_uv = image1_(u1+i,v1+j);
00226       I2_uv =  image2(u2+i,v2+j);
00227 
00228       result += (I1_uv - average_I1_uv)*(I2_uv - average_I2_uv);
00229     }
00230   }
00231 
00232   result /= vcl_sqrt(std_dev_I1_uv*std_dev_I1_uv*std_dev_I2_uv*std_dev_I2_uv);
00233 
00234   return result;
00235 }

Generated on Sat Nov 22 05:08:29 2008 for core/vil1 by  doxygen 1.5.1