1. 唠嗑
昨天花了比较多的时间在编程上(吐槽一句编程有待提高),结果效率很低,因为并没有学到什么东西,也没有想出什么有趣的东西。这也引发了我的一个思考:学习算法的时候,编程到底应该占多重要的地位?
2. 二值化算法思考
2.1 迭代法是基于双峰的分割法的改进吗
很有意思,最近在学习的时候总是能触类旁通,每一个算法都有一个深厚的背景,并能带我到其他领域一睹风采。
为了验证博客“十三种...”下面博友所评论的“迭代法和ISODATA”是一种算法,今天早上我查了一些资料,对这些算法也有一个肤浅的了解了。刚好,这两个问题的答案其实是同一个。
先解答2.1:二值化可以看成是一种聚类的问题:只不过是给出了类的数目。在这个问题上,倘若灰度直方图具有双峰,那自然能给我们一个简单的方向:往两个峰中间去找。当然这个找固然是有一个好坏之分的,但是因为我们现在的二值化图像的评价标准不一,为了简便,我们选用了这两个简单的阈值:一个是谷底,另一个是双峰的平均。从这个意义上看,迭代法确实是双峰法的改进,因为这两种算法本质上都是在“聚类”。反过来说也可以这样理解:基于双峰的两个算法,也可以用于解聚类问题。
在我现在的理解里面,迭代法等同于聚类算法里面的"K-means"算法,而非ISODATA算法。原因如下:
1. 二值化任务已经给出了类的数量:两个
2. 因为没有类的不确定,自然也不需要在一个流程里面执行合并和分裂。迭代法的流程里面,核心的是对新的阈值的更新,并且使用这个阈值重新进行处理。这一点恰恰与 K-means 算法的流程吻合。
所以上面就是我给出的答案。另外,在查找资料的时候,对于ISODATA算法的流程还是有一点疑问:算法是如何保证最后得出的类的数目就是所需要的类的数目?对于这个问题,算法最后应该得到的数目不一定是我们所需要的类的数目,这个参数给出来只是一个参考,可以见参考资料2中的实例。这样也就看出来了ISODATA的弊端:比较依赖于初始给的参数。
2.2 那参考资料2提到的ISODATA算法的核心流程是怎么样的?
草拟大爷,真tm打脸。从参考资料2看,迭代算法跟ISODATA算法就是同一个没错,但是我认为应该等同于的是K-means算法啊。怀疑这个有错,当然可能是我学得不精,思考不深入,望明白的博友指出。
2.3 如何理解参考资料2里面的“基于模糊集理论"的算法?
要理解这个先理解“熵”这个概念,既然需要理解这个概念不如顺便把“一维最大熵”粗浅地学一次。
首先理解了熵的定义,了解其意义:代表着一种“信息量”。做了这两个部分不难理解这个算法了:毕竟我们不是数学家,不需要思考得十分深入(例如有没有等价的表述,“熵”这个概念的缺点在哪里,这些我们都不需要考虑。当然有时间,有能力可以思考,或许能从里面获得一些别的有趣的东西)。该算法选取一个阈值,能够使得整幅图的熵最大。
刚开始阅读参考资料2跳转出去的链接,初初感觉有些困难,这是因为个人的理论水平所限。不过经过一会的思考之后,希望自己的理解是正确的。同样要理解几个关键的概念与公式,第一个是“熵”,第二个是“隶属度”,第三个是香农函数。前面两个倘若我们不去深究的话,是比较容易理解的。这里着重说一下自己对香农函数的理解:香农函数的形式可以写成两个熵相加之后再平均,这一部分可以这么理解:因为我们所选取的隶属函数是有一定偏差的,不可能十分准确;那么第一部分的熵,就是指的是分的对的熵,第二部分的熵,就是指分的对的反面,也就是分不对的熵。整个式子,代表的是“分类”这一个事情的熵,或者从另一个意义上面说,就是一种“模糊度的度量”。那么接下来就好办的,因为根据熵的意义,我们最好把这个时候的熵取最小。这样的话,“分类”这一个事情的“模糊度”就越小。
这些只是个人的理解,因为没能在网上查到有助于我理解的资料。希望各位博友倘若看出有理解不当之处,请斧正。
另外,很喜欢这样学习的感觉,感觉很有意思。
3. 参考资料
1. zhiyong_will 的CSDN博客: 简单易学的机器学习算法——K-Means算法
2. Imageshop : 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。
3. liangdas 的CSDN博客:ISODATA分类法
4. 心得吐槽
1. 最近要做的事情好像有点多...
2. 拖了好久自认为把二值化写完,果然还是要靠时间要熬啊...
3. 哈哈哈,找到两个能与我分享快乐的队友,很高兴。手动滑稽