图像处理 之 统计数组中连续0/1的个数

有时,我们需要统计数组中连续的0/1的个数,或者矩阵中每一行或列中连续0/1的个数,传统方法需要使用两层循环来实现,对于matlab而言太不高效了,有木有又简便又高效的方法呢?
下面以统计连续0的个数为例(统计连续1的个数只需取反操作即可),对于如下数组:

这里写图片描述

我们要统计其中连续0出现的次数,很容易观察出是1,1,1,3。那我们如何不通过循环快速获得结果呢?不妨看看如下提示

这里写图片描述

不难发现,累加数组(cumsum的结果数组)的每一项是原始数组前n项的累加和。既然如此,如果原始数组中第n项为0,那前n项和前n-1项的累加和应该相等才对。而且结果确实如此。
由此不难想出,统计连续0的个数,间接转换成了统计累加数组中每个值出现的频数减一。这里使用tabulate函数,具体用法可在matlab命令窗口中doc tabulate。

这里写图片描述

这里写图片描述

即可获得结果预期结果。
如果我们要快速获得出现次数最多的连续0的个数,还有更简便的方法

这里写图片描述

原理与上面相似,mode只输出出现频率最高的数字及其出现的次数。

但该方法有一点需要注意,就是待统计数字出现在数组开头时,会出现1的误差。

这里写图片描述

我们在原始数组a的基础上,在头部增加了两个0,得到数组b,预期结果变成了2,1,1,1,3。但按照刚才的方法结果却变成了1,1,1,1,3。具体原因也很好理解,大家查看中间结果就可以明白。
为了避免这种问题,我们可只需在数组b的头部加入一个0即可。

这里写图片描述

同时,也不会影响原始数组a的结果

这里写图片描述

当数组切换成矩阵时,也可以进行上述操作中的mode操作(tabulate操作只支持向量),即可统计出每一列中连续0的个数

这里写图片描述

猜你喜欢

转载自blog.csdn.net/SkullSky/article/details/70860015
今日推荐