如何求出二值图像中物体的个数、最大物体的面积(算法思路,无代码)

前言

        这2个问题中,其实求出个数的时候就已经能够很简单地求出最大物体的面积了。相关算法的过程其实与二部图算法及其相似。

求物体的个数、面积

       

        我们假设二值图像如上,1代表前景,0代表背景。那么这个图像一共有两个图形。 我们求取面积的方式如下:

        1、复制一个与原图相同大小的矩阵,用于存每各像素值归属于哪个物体或者背景。我们可以设定背景为0,物体则按照序号编排。得到的矩阵如下:

         2、遍历每一个像素值,如果该像素值是1(前景),且他的归属矩阵为0,则对他进行归属操作,并判断其周围的像素值是否可以被归属到与他同一个物体内。

        例:(以八邻域为例)(1)如下图所示,我们经过遍历后发现了第一个可以进行归属的像素,并将它归属于第一个物体,随后开始判断其周围的像素是否可以被归属。

        (2)我们对该像素周围的点进行判断后,发现有两个点可以被归属到与他同一个物体内,则对这两个点进行同样的操作。

      

         (3)再对这些点周围的像素值判断后,我们可以发现两个新的点的归属值被赋值成1,然后我们对这几个新的点周围的像素点也进行归属判断。随后我们发现,第一个物体检索到这里已经结束了。

         注:以上的操作看起来很复杂,其实都是在一个递归函数里面处理的,这个递归函数的输入为需要我们检索周围点的点的坐标,功能是将这个点的归属值变成我们的指定值,并对他周围的像素值为1,归属值为0的点进行递归

         (4)随后我们的主函数会继续向后遍历,由于之前遍历的时候,我们在下图方框的位置进行了一次归属的递归操作,因此我们遍历的下一个目标是下面这个圈圈的位置。那这么做会不会导致重新给这个物体进行归属递归呢?并不会,因为我们进行归属递归的前提是:这个点的归属值是0(背景)且像素值为1。 这就说明,我们对一个物体进行了归属递归后,这个物体中每一个点都不会再被执行归属递归,也就是说,一个物体只会进行一次归属递归。所以我们就可以大胆地添加一个变量,在每一次归属递归后将这个变量+1,来区分不同的物体。

         (5)最终得到的图如下:

 

        那么,由于我们有一个变量来计算下一个物体的编号(如物体1检索完毕后,这个值变成2,物体2检索完毕后,这个值变成3,这个值会在每次归属递归的时候被作为归属值传递给递归函数),因此,我们在最后结束所有的归属操作后,这个变量-1就是当前图像中的物体个数。我们可以创建与物体个数大小的数组,遍历求取每一个归属值所包含的像素个数,即为每一个物体的面积。如上图,物体1对应面积为5,物体2对应面积为3。

本来要讲一下周长的做法的,发现我周长的代码写错了,在极端情况下无法通过,就不讲了。

猜你喜欢

转载自blog.csdn.net/qq_51135645/article/details/125071211