aihot  2017-05-18 19:26:26  OpenCV |   查看评论   

实现代码erode.hpp:

  1. // fbc_cv是免费软件,并且使用与OpenCV相同的许可证
  2.   
  3. #ifndef FBC_CV_ERODE_HPP_  
  4. #define FBC_CV_ERODE_HPP_  
  5.   
  6. /* reference: include/opencv2/imgproc.hpp 
  7.               modules/imgproc/src/morph.cpp 
  8. */  
  9.   
  10. #include <typeinfo>  
  11. #include "core/mat.hpp"  
  12. #include "imgproc.hpp"  
  13. #include "filterengine.hpp"  
  14. #include "core/core.hpp"  
  15. #include "morph.hpp"  
  16.   
  17. namespace fbc {  
  18.   
  19. // 通过使用特定的结构元素来侵蚀图像  
  20. // \f[\texttt{ dst } (x, y) = \min _{ (x',y') : \, \texttt{ element } (x',y') \ne0 } \texttt{ src } (x + x',y+y')\f]  
  21. // 在多通道图像的情况下,每个通道被独立处理.  
  22. // 侵蚀可以应用几次(迭代)次.  
  23. // 支持类型:uchar / float,多通道  
  24. template<typename _Tp, int chs>  
  25. int erode(const Mat_<_Tp, chs>& src, Mat_<_Tp, chs>& dst, Mat_<uchar, 1>& kernel,  
  26.     Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = Scalar::all(DBL_MAX))  
  27. {  
  28.     FBC_Assert(typeid(uchar).name() == typeid(_Tp).name() || typeid(float).name() == typeid(_Tp).name()); // uchar || float  
  29.     if (dst.empty()) {  
  30.         dst = Mat_<_Tp, chs>(src.rows, src.cols);  
  31.     } else {  
  32.         FBC_Assert(src.rows == dst.rows && src.cols == dst.cols);  
  33.     }  
  34.   
  35.     Size ksize = !kernel.empty() ? kernel.size() : Size(3, 3);  
  36.     anchor = normalizeAnchor(anchor, ksize);  
  37.   
  38.     if (iterations == 0 || kernel.rows * kernel.cols == 1) {  
  39.         src.copyTo(dst);  
  40.         return 0;  
  41.     }  
  42.   
  43.     if (kernel.empty()) {  
  44.         kernel = Mat_<uchar, 1>(1 + iterations * 2, 1 + iterations * 2);  
  45.         getStructuringElement(kernel, MORPH_RECT, Size(1 + iterations * 2, 1 + iterations * 2));  
  46.         anchor = Point(iterations, iterations);  
  47.         iterations = 1;  
  48.     } else if (iterations > 1 && countNonZero(kernel) == kernel.rows * kernel.cols) {  
  49.         anchor = Point(anchor.x*iterations, anchor.y*iterations);  
  50.         kernel = Mat_<uchar, 1>(ksize.height + (iterations - 1)*(ksize.height - 1), ksize.width + (iterations - 1)*(ksize.width - 1));  
  51.         getStructuringElement(kernel, MORPH_RECT,  
  52.             Size(ksize.width + (iterations - 1)*(ksize.width - 1), ksize.height + (iterations - 1)*(ksize.height - 1)), anchor);  
  53.         iterations = 1;  
  54.     }  
  55.   
  56.     anchor = normalizeAnchor(anchor, kernel.size());  
  57.   
  58.     Ptr<BaseRowFilter> rowFilter;  
  59.     Ptr<BaseColumnFilter> columnFilter;  
  60.     Ptr<BaseFilter> filter2D;  
  61.   
  62.     if (countNonZero(kernel) == kernel.rows*kernel.cols) {  
  63.         // 矩形结构元素  
  64.         rowFilter = getMorphologyRowFilter<_Tp, chs>(0, kernel.cols, anchor.x);  
  65.         columnFilter = getMorphologyColumnFilter<_Tp, chs>(0, kernel.rows, anchor.y);  
  66.     } else {  
  67.         filter2D = getMorphologyFilter<_Tp, chs>(0, kernel, anchor);  
  68.     }  
  69.   
  70.     Scalar borderValue_ = borderValue;  
  71.     if (borderType == BORDER_CONSTANT && borderValue_ == Scalar::all(DBL_MAX)) {  
  72.         if (sizeof(_Tp) == 1) // CV_8U  
  73.             borderValue_ = Scalar::all((double)UCHAR_MAX);  
  74.         else // CV_32F  
  75.             borderValue_ = Scalar::all((double)FLT_MAX);  
  76.     }  
  77.   
  78.     Ptr<FilterEngine<_Tp, _Tp, _Tp, chs, chs, chs>> f = makePtr<FilterEngine<_Tp, _Tp, _Tp, chs, chs, chs>>(filter2D, rowFilter, columnFilter, borderType, borderType, borderValue_);  
  79.     f->apply(src, dst);  
  80.     for (int i = 1; i < iterations; i++)  
  81.         f->apply(dst, dst);  
  82.   
  83.     return 0;  
  84. }  
  85.   
  86. // 命名空间fbc
  87.   
  88. #endif // FBC_CV_ERODE_HPP_  

 

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自OpenCV代码提取:erode函数的实现

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]