00001
00002 #ifndef _VISOPS_H_
00003 #define _VISOPS_H_
00004
00005 #include "SketchTypes.h"
00006 #include "Sketch.h"
00007 #include "SketchSpace.h"
00008
00009 #include "ShapeLine.h"
00010
00011 class DualCoding::SketchIndices;
00012
00013
00014 namespace visops {
00015
00016 using namespace DualCoding;
00017 using DualCoding::uchar;
00018 using DualCoding::uint;
00019
00020
00021 enum Connectivity_t { FourWayConnect, EightWayConnect };
00022
00023
00024
00025
00026
00027 Sketch<bool> zeros(SketchSpace& space);
00028
00029
00030 Sketch<bool> zeros(const SketchRoot& sketch);
00031
00032
00033 template<class T>
00034 Sketch<T> copy(const Sketch<T>& other) {
00035 Sketch<T> result("copy("+other->getName()+")", other);
00036 *result.pixels = *other.pixels;
00037 return result;
00038 }
00039
00040
00041
00042
00043
00044
00045
00046 template<class T>
00047 Sketch<T> max(const Sketch<T>& src, const T value) {
00048 Sketch<T> result("max(const)",src);
00049 for ( unsigned int i = 0; i < src.pixels->size()-1; i++ )
00050 (*result.pixels)[i] = std::max((*src.pixels)[i],value);
00051 return result;
00052 }
00053
00054
00055 template<class T>
00056 Sketch<T> max(const Sketch<T>& src, const int value) {
00057 return visops::max(src, (T)(value));
00058 }
00059
00060
00061
00062 template<class T>
00063 Sketch<T> max(const Sketch<T>& arg1, const Sketch<T>& arg2) {
00064 Sketch<T> result("max("+arg1->getName()+","+arg2->getName()+")",arg1);
00065 for ( unsigned int i = 0; i < arg1.pixels->size()-1; i++ )
00066 (*result.pixels)[i] = std::max((*arg1.pixels)[i],(*arg2.pixels)[i]);
00067 return result;
00068 }
00069
00070
00071 template<class T>
00072 Sketch<T> min(const Sketch<T>& src, const T value) {
00073 Sketch<T> result("min(const)",src);
00074 for ( unsigned int i = 0; i < src.pixels->size()-1; i++ )
00075 (*result.pixels)[i] = std::min((*src.pixels)[i],value);
00076 return result;
00077 }
00078
00079
00080 template<class T>
00081 Sketch<T> min(const Sketch<T>& src, const int value) {
00082 return visops::min(src, (T)(value));
00083 }
00084
00085
00086 template<class T>
00087 Sketch<T> min(const Sketch<T>& arg1, const Sketch<T>& arg2) {
00088 Sketch<T> result("min("+arg1->getName()+","+arg2->getName()+")",arg1);
00089 for ( unsigned int i = 0; i < arg1.pixels->size()-1; i++ )
00090 (*result.pixels)[i] = std::min((*arg1.pixels)[i],(*arg2.pixels)[i]);
00091 return result;
00092 }
00093
00094
00095
00096
00097
00098
00099
00100 Sketch<bool> seedfill(const Sketch<bool>& borders, size_t index);
00101
00102
00103 Sketch<bool> fillExterior(const Sketch<bool>& borders);
00104
00105
00106 Sketch<bool> fillInterior(const Sketch<bool>& borders);
00107
00108
00109
00110
00111
00112
00113
00114 Sketch<bool> colormask(const Sketch<uchar>& src, const std::string &colorname);
00115
00116
00117 Sketch<bool> colormask(const Sketch<uchar>& src, color_index cindex);
00118
00119
00120
00121
00122 Sketch<uchar> neighborSum(const Sketch<bool> &im, Connectivity_t connectivity=EightWayConnect);
00123
00124
00125
00126
00127
00128
00129
00130 Sketch<bool> fillin(const Sketch<bool> &im, int iter,
00131 uchar min_thresh, uchar max_thresh,
00132 bool remove_only=false);
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 Sketch<uint> bdist(const Sketch<bool> &dest, const Sketch<bool> &obst,
00145 const uint maxdist=(uint)-1);
00146
00147
00148
00149
00150
00151
00152 Sketch<uint> edist(const Sketch<bool> &dest);
00153
00154
00155 Sketch<uint> labelcc(const Sketch<bool>& source, int minarea=1);
00156
00157
00158
00159
00160
00161 Sketch<uint> oldlabelcc(const Sketch<bool>& source,
00162 Connectivity_t connectivity=EightWayConnect);
00163
00164
00165 Sketch<uint> areacc(const Sketch<bool>& source, Connectivity_t connectivity=EightWayConnect);
00166
00167
00168 Sketch<uint> areacc(const Sketch<uint>& labels);
00169
00170
00171 Sketch<bool> minArea(const Sketch<bool>& sketch, int minval=5);
00172
00173
00174
00175
00176
00177
00178 template<typename T>
00179 Sketch<T> mask(const Sketch<T> &A, const Sketch<bool> &B) {
00180 Sketch<T> result("mask("+A->getName()+","+B->getName()+")", A);
00181 T* Aptr = &(*A.pixels)[0];
00182 T* Rptr = &(*result.pixels)[0];
00183 T* Rend = &(*result.pixels)[result->getNumPixels()];
00184 unsigned int idx = 0;
00185 while ( Rptr != Rend )
00186 *Rptr++ = B[idx++] * (*Aptr++);
00187 return result;
00188 }
00189
00190
00191
00192 template<typename T>
00193 Sketch<T> ifNot(const Sketch<T> &A, const Sketch<T> &B) {
00194 Sketch<T> result("ifNot("+A->getName()+","+B->getName()+")", A);
00195 T* Aptr = &(*A.pixels)[0];
00196 T* Bptr = &(*B.pixels)[0];
00197 T* Rptr = &(*result.pixels)[0];
00198 T* Rend = &(*result.pixels)[result->getNumPixels()];
00199 while ( Rptr != Rend ) {
00200 *Rptr++ = ( *Aptr != 0 ) ? *Aptr : * Bptr;
00201 *Aptr++; Bptr++;
00202 }
00203 return result;
00204 }
00205
00206
00207 template<typename T, typename Tv>
00208 Sketch<T> maskedAssign(const Sketch<T> &sketch, const Sketch<bool> &mask, const Tv value) {
00209 Sketch<T> result("maskedAssign("+sketch->getName()+")",sketch);
00210 T* Psrc = &(*sketch.pixels)[0];
00211 T* Pdest = &(*result.pixels)[0];
00212 T* Edest = &(*result.pixels)[sketch->getNumPixels()];
00213 bool* Pmask =&(*mask.pixels)[0];
00214 const T val = (T)value;
00215 while ( Pdest != Edest ) {
00216 *Pdest++ = *Pmask++ ? val : *Psrc;
00217 Psrc++;
00218 }
00219 return result;
00220 }
00221
00222
00223 template<typename T>
00224 Sketch<T> maskedAssign(const Sketch<T> &sketch, const Sketch<bool> &mask, const Sketch<T> &value) {
00225 Sketch<T> result("maskedAssign("+sketch->getName()+")",sketch);
00226 T* Psrc = &(*sketch.pixels)[0];
00227 T* Pdest = &(*result.pixels)[0];
00228 T* Edest = &(*result.pixels)[sketch->getNumPixels()];
00229 bool* Pmask = &(*mask.pixels)[0];
00230 T* Pval = &(*value.pixels)[0];
00231 while ( Pdest != Edest ) {
00232 *Pdest++ = *Pmask++ ? *Pval : *Psrc;
00233 Pval++;
00234 Psrc++;
00235 }
00236 return result;
00237 }
00238
00239
00240
00241
00242
00243
00244
00245
00246 Sketch<bool> edge(const Sketch<bool> &im);
00247
00248
00249
00250
00251
00252
00253
00254 Sketch<bool> horsym(const Sketch<bool>& sketch,
00255 int minskip=3, int maxskip=80);
00256
00257
00258
00259
00260
00261
00262
00263 Sketch<bool> versym(const Sketch<bool>& sketch,
00264 int minskip=3, int maxskip=80);
00265
00266
00267
00268 Sketch<bool> skel(const Sketch<bool>& sketch);
00269
00270
00271
00272
00273
00274
00275
00276 Sketch<bool> leftHalfPlane(const Shape<LineData> &ln);
00277
00278 Sketch<bool> rightHalfPlane(const Shape<LineData> &ln);
00279
00280 Sketch<bool> topHalfPlane(const Shape<LineData> &ln);
00281
00282 Sketch<bool> bottomHalfPlane(const Shape<LineData> &ln);
00283
00284
00285
00286 Sketch<bool> non_bounds(const Sketch<bool>& im, int offset);
00287
00288
00289
00290
00291
00292 Sketch<uchar> susan_edges(const Sketch<uchar>& im, int brightness);
00293
00294
00295 Sketch<bool> susan_edge_points(const Sketch<uchar>& im, int brightness);
00296
00297
00298 Sketch<uint> convolve(const Sketch<uchar> &sketch, Sketch<uchar> &kernel,
00299 int i, int j, int width, int height);
00300
00301
00302 Sketch<uint> templateMatch(const Sketch<uchar> &sketch, Sketch<uchar> &kernel,
00303 int i, int j, int width, int height);
00304
00305
00306
00307 }
00308
00309 #endif