赞
踩
一种利用堆栈实现的算法,更改了一下大佬的代码,在opencv实现二值图的孔洞填充效果。
具体原理:c++实现扫描线种子填充算法
- //在当前扫描线上下两端寻找新的种子
- //stack为系统堆栈 背景0 前景255
- void FindNewSeed(Mat& src, stack<Point>& s, int left, int right, int y, int bcolor, int ncolor)
- {
- for (int i = left + 1; i < right; i++)
- {
- if (GetPixel(src, i, y) != ncolor)
- {
- int j = i + 1;
- while (GetPixel(src, j, y) != ncolor)
- j++;
- i = j--;
- s.push(Point(j, y));
- }
- }
- }
-
- //扫描线种子填充算法 背景0 前景255
- void ScanLineFlood(Mat& src, int x, int y, int bcolor, int ncolor)
- {
- //SetPixel(src, x, y, ncolor); // 设置种子点像素
- stack<Point> s;
- Point p;
- int left, right;
- s.push(Point(x, y));
- while (!s.empty())
- {
- //栈顶元素出栈
- p = s.top();
- s.pop();
-
- //向左填充
- for (left = p.x; GetPixel(src, left, p.y) != ncolor; left--) // 左边界
- SetPixel(src, left, p.y, ncolor);
- //向右填充
- for (right = p.x + 1; GetPixel(src, right, p.y) != ncolor; right++) // 右边界
- SetPixel(src, right, p.y, ncolor);
-
- //在当前行的下一行寻找确定新的种子点
- FindNewSeed(src, s, left, right, p.y - 1, bcolor, ncolor);
- //在当前行的上一行寻找确定新的种子点
- FindNewSeed(src, s, left, right, p.y + 1, bcolor, ncolor);
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。