关于图形填充的讨论

关于图形填充,本来认为其算法肯定是象墨水滴入大水缸一样,不断递归导致最后填充完成。类似与种子填充。记得6年前曾经想在MFC写个涂色函数的时候使用过这个逻辑,但是瞬间栈溢出了。后来发现MFC里面自带了,于是也就没有关注了。

    直到6年后,这个问题再次出现了。同事在弄图像识别的时候,在matlab里面用到了imfill("holes"),问我,这个函数转到C++上怎么实现,大致的图像区域是个矩形,只要得到对角线顶点坐标即可。。。我突然想到了5年前,为了做图像放大,我写的二值图像轮廓跟踪法找边界(写完了baidu才知道叫轮廓跟踪)。只要用轮廓跟踪,记录轮廓一圈最大的x,y坐标,即得对角线点坐标。当然,这种填充效果类似于圆外截矩形。同事不怎么相信,认为matlab的实现方法应该更强大。

    后来同事baidu了,貌似OpenCV可以实现imfill,见链接如下

http://blog.sina.com.cn/s/blog_79bb01d00101btsq.html

其中核心调用函数为findContours。顾名思义就是找边界。看来可能在C++里面实现,应该也是找完边界后填充了。


    本来以为5年前,实现的轮廓跟踪应该是没有用了,没想到还能应用在填充上。难道轮廓跟踪这是一个很重要的数字图像算法,很多高级点的算法都是以此为基础而搭建的么?看来不能小看过去的发现啊。后面有时间,要把过去的代码翻出来重构下。指不定能发现什么新的东西呢。


    对于这件事情。给我的感想颇多,毕竟实现轮廓跟踪,解决我当时面对的问题,可以说,是我整个生涯的亮点,其过程也是我最大兴趣的所在。 但是面试的时候,每次我把这个案例提到,对方一般都有些不屑(毕竟这算法很基础)都问,为什么opencv里面有现成实现,你不用。甚至对方很专业的说,现在弄这块的人,都是对已有东西的拼拼凑凑,修修改改,你当自己是在做研究么?我们是在做产品。无可厚非,对方说的有其道理。

   但是自己实现一遍,对内部原理会理解的非常透彻,包括现在我都能回忆当初遇到的一个未考虑到的一种特殊图像而引发的bug,我是怎么分析bug,怎么定位,怎么修改算法,最后自测试通过的。就单单这点,就非常有价值。我觉得现成的算法调用是很方便,面向对象思想固然很好。但是如果当初我仅仅是找对象解决这个问题,今天我不会这么快反应填充的实现算法是什么。(虽然,我当初也不知道自己做的属于数字图像处理)

   诚然,为了尽快解决问题,最好的方法就是去找对象,然后通过对象来搞定问题,乍看这样最高效。貌似现在也最喜欢这么干。但是问题是如果以后需求稍有变化,或者突然在什么情况下,在调用该对象接口的时候搞出了bug,你怎么解决。还是baidu么?受别人对象的制约真的好么?不过这里只是提出疑问,并没有说什么都要自己实现,这也不现实。

    所谓学习不也是了解对象内部,学习如何调用接口么。废话说太多了,打住吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值