TuttleOFX  1
correlate.hpp
Go to the documentation of this file.
00001 #ifndef _TERRY_FILTER_CORRELATE_HPP_
00002 #define _TERRY_FILTER_CORRELATE_HPP_
00003 
00004 #include "detail/inner_product.hpp"
00005 
00006 #include <terry/numeric/operations.hpp>
00007 #include <terry/numeric/assign.hpp>
00008 #include <terry/numeric/init.hpp>
00009 #include <terry/pixel_proxy.hpp>
00010 
00011 
00012 namespace terry {
00013 namespace filter {
00014 
00015 /// @brief 1D un-guarded correlation with a variable-size kernel
00016 template <typename PixelAccum, typename SrcIterator, typename KernelIterator, typename Integer, typename DstIterator>
00017 GIL_FORCEINLINE
00018 DstIterator correlate_pixels_n(
00019         SrcIterator src_begin,
00020         SrcIterator src_end,
00021         KernelIterator ker_begin,
00022         Integer ker_size,
00023         DstIterator dst_begin )
00024 {
00025         using namespace terry::numeric;
00026         
00027     typedef typename pixel_proxy<typename std::iterator_traits<SrcIterator>::value_type>::type PIXEL_SRC_REF;
00028     typedef typename pixel_proxy<typename std::iterator_traits<DstIterator>::value_type>::type PIXEL_DST_REF;
00029     typedef typename std::iterator_traits<KernelIterator>::value_type kernel_type;
00030     PixelAccum acc_zero; pixel_zeros_t<PixelAccum>()(acc_zero);
00031 
00032         while( src_begin != src_end )
00033         {
00034         pixel_assigns_t<PixelAccum,PIXEL_DST_REF>()(
00035             std::inner_product(src_begin,src_begin+ker_size,ker_begin,acc_zero,
00036                                pixel_plus_t<PixelAccum,PixelAccum,PixelAccum>(),
00037                                pixel_multiplies_scalar_t<PIXEL_SRC_REF,kernel_type,PixelAccum>()),
00038             *dst_begin);
00039         ++src_begin; ++dst_begin;
00040     }
00041     return dst_begin;
00042 }
00043 
00044 /// @brief 1D un-guarded correlation with a fixed-size kernel
00045 template <std::size_t Size,typename PixelAccum,typename SrcIterator,typename KernelIterator,typename DstIterator>
00046 GIL_FORCEINLINE
00047 DstIterator correlate_pixels_k(
00048         SrcIterator src_begin,
00049         SrcIterator src_end,
00050         KernelIterator ker_begin,
00051         DstIterator dst_begin )
00052 {
00053         using namespace terry::numeric;
00054         
00055     typedef typename pixel_proxy<typename std::iterator_traits<SrcIterator>::value_type>::type PIXEL_SRC_REF;
00056     typedef typename pixel_proxy<typename std::iterator_traits<DstIterator>::value_type>::type PIXEL_DST_REF;
00057     typedef typename std::iterator_traits<KernelIterator>::value_type kernel_type;
00058     PixelAccum acc_zero; pixel_zeros_t<PixelAccum>()(acc_zero);
00059 
00060         while( src_begin != src_end )
00061         {
00062         pixel_assigns_t<PixelAccum,PIXEL_DST_REF>()(
00063             inner_product_k<Size>(src_begin,ker_begin,acc_zero,
00064                                   pixel_plus_t<PixelAccum,PixelAccum,PixelAccum>(),
00065                                   pixel_multiplies_scalar_t<PIXEL_SRC_REF,kernel_type,PixelAccum>()),
00066             *dst_begin);
00067         ++src_begin; ++dst_begin;
00068     }
00069     return dst_begin;
00070 }
00071 
00072 
00073 }
00074 }
00075 
00076 
00077 #endif