2 #ifndef vil_correlate_1d_h_ 3 #define vil_correlate_1d_h_ 13 # include <vcl_msvc_warnings.h> 23 template <
class srcT,
class destT,
class kernelT,
class accumT>
25 destT* dest0, std::ptrdiff_t d_step,
26 const kernelT* kernel,
27 std::ptrdiff_t k_lo, std::ptrdiff_t k_hi,
33 vil_convolve_edge_1d(src0,nx,s_step,dest0,d_step,kernel,-k_hi,-k_lo,-1,ac,start_option);
35 const kernelT* k_begin = kernel+k_lo;
36 const kernelT* k_end = kernel+k_hi+1;
37 const srcT* src = src0;
39 destT* end_dest = dest0 + d_step*(int(nx)-k_hi);
40 for (destT* dest = dest0-d_step*k_lo;dest!=end_dest;dest+=d_step,src+=s_step)
44 for (
const kernelT *k = k_begin;k!=k_end; ++k,s+=s_step) sum+= (accumT)((*k)*(*s));
50 dest0+(nx-1)*d_step,-d_step,
51 kernel,k_lo,k_hi,1,ac,end_option);
61 template <
class srcT,
class destT,
class kernelT,
class accumT>
64 const kernelT* kernel,
65 std::ptrdiff_t k_lo, std::ptrdiff_t k_hi,
70 unsigned ni = src_im.
ni();
71 unsigned nj = src_im.
nj();
72 std::ptrdiff_t s_istep = src_im.
istep(), s_jstep = src_im.
jstep();
75 std::ptrdiff_t d_istep = dest_im.
istep(),d_jstep = dest_im.
jstep();
77 for (
unsigned int p=0;p<src_im.
nplanes();++p)
88 for (
unsigned int j=0;j<nj;++j,src_row+=s_jstep,dest_row+=d_jstep)
90 kernel,k_lo,k_hi,ac,start_option,end_option);
92 for (
unsigned int j=0;j<nj;++j,src_row+=s_jstep,dest_row+=d_jstep)
94 kernel,k_lo,k_hi,ac,start_option,end_option);
99 for (
unsigned int j=0;j<nj;++j,src_row+=s_jstep,dest_row+=d_jstep)
101 kernel,k_lo,k_hi,ac,start_option,end_option);
103 for (
unsigned int j=0;j<nj;++j,src_row+=s_jstep,dest_row+=d_jstep)
105 kernel,k_lo,k_hi,ac,start_option,end_option);
110 template <
class destT,
class kernelT,
class accumT>
114 const kernelT* kernel, std::ptrdiff_t k_lo, std::ptrdiff_t k_hi,
120 template <
class kernelT,
class accumT,
class destT>
127 const kernelT* kernel, std::ptrdiff_t k_lo, std::ptrdiff_t k_hi,
140 std::ptrdiff_t k_lo, std::ptrdiff_t k_hi,
const accumT ac,
146 unsigned j0,
unsigned nj)
const override 148 if (i0 +
ni >
src_->ni() || j0 +
nj >
src_->nj())
return nullptr;
149 const unsigned lsrc = (unsigned)std::max(0,
int(i0+
klo_));
150 const unsigned hsrc = std::min(
src_->ni(),(
unsigned int)(i0+
ni-
klo_+
khi_));
151 const unsigned lboundary = std::min((
unsigned) -
klo_, i0);
152 assert (hsrc > lsrc);
155 switch (vs->pixel_format())
157 #define macro( F , T ) \ 159 vil_correlate_1d(static_cast<vil_image_view<T >&>(*vs),dest, \ 160 kernel_, klo_, khi_, accumT(), start_option_, end_option_); \ 161 return new vil_image_view<destT>(vil_crop(dest, lboundary, ni, 0, nj)); 181 unsigned ni()
const override {
return src_->ni(); }
182 unsigned nj()
const override {
return src_->nj(); }
191 std::cerr <<
"WARNING: vil_correlate_1d_resource::put_back\n" 192 <<
"\tYou can't push data back into a correlate filter.\n";
197 bool get_property(
char const* tag,
void* property_value =
nullptr)
const override 200 return property_value ? (*static_cast<bool*>(property_value)) =
true :
true;
202 return src_->get_property(tag, property_value);
217 template <
class destT,
class kernelT,
class accumT>
221 const kernelT* kernel, std::ptrdiff_t k_lo, std::ptrdiff_t k_hi,
229 #endif // vil_correlate_1d_h_ An abstract base class of smart pointers to actual image data in memory.
enum vil_pixel_format pixel_format() const override
Pixel Format.
vil_correlate_1d_resource(const vil_image_resource_sptr &src, const kernelT *kernel, std::ptrdiff_t k_lo, std::ptrdiff_t k_hi, vil_convolve_boundary_option start_option, vil_convolve_boundary_option end_option)
Construct a correlate filter.
Extend the signal periodically beyond the boundary.
Concrete view of image data of type T held in memory.
void set_size(unsigned ni, unsigned nj) override
resize current planes to ni x nj.
unsigned ni() const override
Dimensions: Planes x ni x nj.
vil_image_view_base_sptr get_copy_view(unsigned i0, unsigned ni, unsigned j0, unsigned nj) const override
Create a read/write view of a copy of this data.
void vil_convolve_edge_1d(const srcT *src, unsigned n, std::ptrdiff_t s_step, destT *dest, std::ptrdiff_t d_step, const kernelT *kernel, std::ptrdiff_t k_lo, std::ptrdiff_t k_hi, std::ptrdiff_t kstep, accumT, vil_convolve_boundary_option option)
Convolve edge with kernel[x*kstep] x in [k_lo,k_hi] (k_hi>=0).
bool put_view(const vil_image_view_base &, unsigned, unsigned) override
Put the data in this view back into the image source.
A resource adaptor that behaves like a correlated version of its input.
std::ptrdiff_t jstep() const
Add this to your pixel pointer to get next j pixel.
vil_convolve_boundary_option
Available options for boundary behavior.
unsigned ni() const
Width.
unsigned nj() const
Height.
std::ptrdiff_t planestep() const
Add this to your pixel pointer to get pixel on next plane.
vil_image_resource_sptr src_
Abstract representation of an image source or image destination.
void vil_correlate_1d(const vil_image_view< srcT > &src_im, vil_image_view< destT > &dest_im, const kernelT *kernel, std::ptrdiff_t k_lo, std::ptrdiff_t k_hi, accumT ac, vil_convolve_boundary_option start_option, vil_convolve_boundary_option end_option)
correlate kernel[i] (i in [k_lo,k_hi]) with srcT in i-direction.
vil_convolve_boundary_option end_option_
A base class reference-counting view of some image data.
There is no class or function called vil_property.
unsigned nplanes() const override
Dimensions: Planes x ni x nj.
T * top_left_ptr()
Pointer to the first (top left in plane 0) pixel.
bool get_property(char const *tag, void *property_value=nullptr) const override
Extra property information.
vil_convolve_boundary_option start_option_
unsigned nplanes() const
Number of planes.
Representation of a generic image source or destination.
std::ptrdiff_t istep() const
Add this to your pixel pointer to get next i pixel.
#define vil_property_read_only
Indicate that you can't call put_view on this image.
unsigned nj() const override
Dimensions: Planes x ni x nj.
1D Convolution with cunning boundary options