请教漫水填充法的判断方法是什么?

wangtong2010 2020-06-02 09:14:41
就是类似windows操作系统自带的附件画图软件中的油漆桶功能是如何实现的?是一个像素点一个像素点地判断颜色,然后再做决定是否替换颜色,然后还得判断是否连通吗?要是那样的话,一个4000*4000像素的位图,一共一千六百万像素,要是这样判断的话,那得多长时间啊!我感觉做 if 判断多了很费时间。我用画图软件做了如下实验,下边是一个4000*4000的图片,

我启动油漆桶功能,点击图片左上角白色像素,只用了一秒钟,就把所有与点击点相连通的白色像素都替换成了绿色,显然不会做过多的 if 判断。那它是怎么判断的呢?又得判断颜色,又得判断是否连通,时间又那么短,它是怎么做到的?关键是怎么判断连通性。
我自己编程用 if 逐个像素点判断该点是否在自己设定的椭圆内,目标图片是一个2000*2000的图片文件,结果用了14分钟,我还以为死机了呢,期间我都刷完牙洗完脚了,而画图只用了一秒钟,方法肯定是有问题的。到底应该怎么判断,不要用指针,因为我对指针很不懂,不要用unsafe代码。
...全文
250 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2020-06-03
  • 打赏
  • 举报
回复
误差是因为插值算法的原因,而不是因为填充算法的原因。
wangtong2010 2020-06-03
  • 打赏
  • 举报
回复
引用 3 楼 OrdinaryCoder 的回复:
画图软件用什么算法,这个看不见源码就不说了,如果真想知道算法细节,可以搜一搜相关论文
这里说一下我如果做这么一个功能的简单思路
1.对整张画布取轮廓 取轮廓的话算法啥的应该很好找 二值化啊什么的
2.判断填充的点在哪个轮廓内
3.填充相应的颜色
以上肯定是要比遍历像素点要快的
还有就是算法这东西到一定程度就需要平衡 准确性和效率 ,具体算法实现方法肯定不止一种

首先感谢。您说的取轮廓是否也要进行一些像素点颜色的判断,找到一个满足填充要求,一个不满足要求的两个相邻点,取其中的一点,然后在横向或纵向上重复上述判断,把这些点连成一个多边形,这是以我的理解能力所能想到的。然后用Graphics的FillPolygon()方法,但我感觉判断轮廓还是有问题,FillPolygon()方法本身也有误差,Graphics.FillEllipse()就有误差,仔细看椭圆并不严格对称。
wanghui0380 2020-06-03
  • 打赏
  • 举报
回复
引用 2 楼 wangtong2010 的回复:
[quote=引用 1 楼 wanghui0380 的回复:] Graphics.FillEllipse
不是这个意思,我就是想了解画图软件油漆桶的快速填充的实现方法,4000*4000个像素,是做4000*4000次 if 判断吗?我只是拿椭圆举个例子,证明 if 判断太慢,实际上填充区域的形状是随机的,不规则的,而画图却又能做到一秒钟瞬间完成。我就是想了解画图油漆桶的实现方法,主要是方法,不一定要程序代码,要代码也可以,但千万不要用指针,因为我实在不懂指针,指针太难理解了,另外C#也不建议用指针。[/quote] Graphics.FillEllipse 提这个是因为你要他研究实现,填充封闭区域,都是GDI+内部已经实现了,除了填充椭圆,也有填充多边形 至于算法,基本都是“连通性判定” https://baike.baidu.com/item/填充算法/998677?fr=aladdin
OrdinaryCoder 2020-06-03
  • 打赏
  • 举报
回复
画图软件用什么算法,这个看不见源码就不说了,如果真想知道算法细节,可以搜一搜相关论文 这里说一下我如果做这么一个功能的简单思路 1.对整张画布取轮廓 取轮廓的话算法啥的应该很好找 二值化啊什么的 2.判断填充的点在哪个轮廓内 3.填充相应的颜色 以上肯定是要比遍历像素点要快的 还有就是算法这东西到一定程度就需要平衡 准确性和效率 ,具体算法实现方法肯定不止一种
wangtong2010 2020-06-03
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
Graphics.FillEllipse

不是这个意思,我就是想了解画图软件油漆桶的快速填充的实现方法,4000*4000个像素,是做4000*4000次 if 判断吗?我只是拿椭圆举个例子,证明 if 判断太慢,实际上填充区域的形状是随机的,不规则的,而画图却又能做到一秒钟瞬间完成。我就是想了解画图油漆桶的实现方法,主要是方法,不一定要程序代码,要代码也可以,但千万不要用指针,因为我实在不懂指针,指针太难理解了,另外C#也不建议用指针。
wanghui0380 2020-06-03
  • 打赏
  • 举报
回复
Graphics.FillEllipse
OrdinaryCoder 2020-06-03
  • 打赏
  • 举报
回复
引用 8 楼 wangtong2010 的回复:
找轮廓怎么会不用判断颜色呢?你想把白色变成绿色,红色不变,你不得知道白色像素点到了哪个坐标点变成红色的吗?
我说的是找到轮廓以后 判断一下 你要填充的轮廓是哪个就可以 比如你鼠标在哪个轮廓中
wangtong2010 2020-06-03
  • 打赏
  • 举报
回复
找轮廓怎么会不用判断颜色呢?你想把白色变成绿色,红色不变,你不得知道白色像素点到了哪个坐标点变成红色的吗?
OrdinaryCoder 2020-06-03
  • 打赏
  • 举报
回复
找轮廓的话应该就不用进行颜色判断了 找到轮廓后只需要判断你填充的轮廓是哪个就好了

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧