一种利用堆栈实现的算法,更改了一下大佬的代码,在opencv实现二值图的孔洞填充效果。
具体原理:c++实现扫描线种子填充算法
//在当前扫描线上下两端寻找新的种子 //stack为系统堆栈 背景0 前景255 void FindNewSeed(Mat& src, stack& 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 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); } }



