当前位置:   article > 正文

C++/opencv实现扫描线种子填充算法_c++扫描线填充算法函数

c++扫描线填充算法函数

一种利用堆栈实现的算法,更改了一下大佬的代码,在opencv实现二值图的孔洞填充效果。

具体原理:c++实现扫描线种子填充算法

  1. //在当前扫描线上下两端寻找新的种子
  2. //stack为系统堆栈 背景0 前景255
  3. void FindNewSeed(Mat& src, stack<Point>& s, int left, int right, int y, int bcolor, int ncolor)
  4. {
  5. for (int i = left + 1; i < right; i++)
  6. {
  7. if (GetPixel(src, i, y) != ncolor)
  8. {
  9. int j = i + 1;
  10. while (GetPixel(src, j, y) != ncolor)
  11. j++;
  12. i = j--;
  13. s.push(Point(j, y));
  14. }
  15. }
  16. }
  17. //扫描线种子填充算法 背景0 前景255
  18. void ScanLineFlood(Mat& src, int x, int y, int bcolor, int ncolor)
  19. {
  20. //SetPixel(src, x, y, ncolor); // 设置种子点像素
  21. stack<Point> s;
  22. Point p;
  23. int left, right;
  24. s.push(Point(x, y));
  25. while (!s.empty())
  26. {
  27. //栈顶元素出栈
  28. p = s.top();
  29. s.pop();
  30. //向左填充
  31. for (left = p.x; GetPixel(src, left, p.y) != ncolor; left--) // 左边界
  32. SetPixel(src, left, p.y, ncolor);
  33. //向右填充
  34. for (right = p.x + 1; GetPixel(src, right, p.y) != ncolor; right++) // 右边界
  35. SetPixel(src, right, p.y, ncolor);
  36. //在当前行的下一行寻找确定新的种子点
  37. FindNewSeed(src, s, left, right, p.y - 1, bcolor, ncolor);
  38. //在当前行的上一行寻找确定新的种子点
  39. FindNewSeed(src, s, left, right, p.y + 1, bcolor, ncolor);
  40. }
  41. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/599479
推荐阅读
相关标签
  

闽ICP备14008679号