TuttleOFX
1
|
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