00001
00002 #ifdef VCL_NEEDS_PRAGMA_INTERFACE
00003 #pragma implementation
00004 #endif
00005
00006
00007
00008
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
00043
00044
00045
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
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;
00075
00076
00077
00078 if (difference_total > early_exit_level)
00079 return difference_total;
00080 }
00081 return difference_total;
00082 }
00083
00084
00085
00086
00087
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
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
00119
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
00155 int n = (int)mask_size_/2;
00156 int m = (int)mask_size_/2;
00157
00158
00159
00160
00161
00162
00163 int u1 = centre1_x_;
00164 int v1 = centre1_y_;
00165 int u2 = centre2_x;
00166 int v2 = centre2_y;
00167
00168
00169 int i,j;
00170
00171 double average_I1_uv;
00172 double average_I2_uv;
00173
00174
00175
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
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
00213
00214
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 }