栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

一种利用堆栈实现的算法,更改了一下大佬的代码,在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);
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030543.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号