Python中的连通组件标记算法

Python中的连通组件标记算法,python,algorithm,edit,connected-components,Python,Algorithm,Edit,Connected Components,我有一张手写文件的灰度图像。 我想通过应用8路CCL算法从这幅灰度图像中提取成分。请提供python代码,以便仅通过导入OpenCV和numpy来完成此操作。我已经设计了一个不完整的代码,如果有人可以完成这项任务,这将是非常有帮助的我 算法如下: 连接的组件矩阵初始化为图像矩阵的大小 对图像中每个检测到的对象初始化并递增标记 初始化计数器以计算对象的数量 对整个图像开始行主扫描 如果检测到对象像素,则在(索引!=0)时重复以下步骤 将图像中对应的像素设置为0 使用当前设置像素的所有相邻像素更新向

我有一张手写文件的灰度图像。 我想通过应用8路CCL算法从这幅灰度图像中提取成分。请提供python代码,以便仅通过导入OpenCV和numpy来完成此操作。我已经设计了一个不完整的代码,如果有人可以完成这项任务,这将是非常有帮助的我

算法如下:

  • 连接的组件矩阵初始化为图像矩阵的大小
  • 对图像中每个检测到的对象初始化并递增标记
  • 初始化计数器以计算对象的数量
  • 对整个图像开始行主扫描
  • 如果检测到对象像素,则在(索引!=0)时重复以下步骤
  • 将图像中对应的像素设置为0
  • 使用当前设置像素的所有相邻像素更新向量(索引)
  • 保留唯一像素,删除重复像素
  • 将索引指示的像素设置为在连接的组件矩阵中进行标记
  • 增加图像中另一个对象的标记。 6.增加图像中另一个对象的标记

  • 有一种可能的方法与您尝试的方法相差不远。假设为背景像素指定了标签0,为对象像素指定了值1

    • 逐行扫描图像

    • 遇到像素1时,设置新标签并执行整体填充操作,用新标签替换1

    洪水填充可以非常简单地实施:

    • 将起始像素设置为新标签

    • 递归地填充八个邻居(如果它们有1)

    这个版本的代码非常简单。但您会注意到,它很容易使堆栈溢出,因为挂起的填充数可能与图像大小一样大

    def FloodFill(X, Y, Label):
        I[X,Y]= Label
        for all 8-way neighbors (X'=X±1, Y'=Y±1, inside image):
            if I[X',Y'] == 1:
                FloodFill(X', Y', Label)
    
    def CCL(Image I):
        Label= 1
        for Y in range(I.Height):
            for X in range(I.Width):
                if I[X, Y] == 1:
                    Label+= 1
                    FloodFill(X, Y, Label)
    
    因此,我推荐扫描线版本,它更复杂一些


    如果有人能完成这项任务,这对我会很有帮助-我敢打赌,如果你正在努力解决某个特定的部分,我们可以提供帮助,但没有人会帮你做功课。Img=cv2.imread(“C://Users//USER//Pictures//Saved Pictures//fig2.tif”,0)[M,N]=Img.shape[:2]Connected=np zeros((M,N))offset=[-1,M,1,-M]Index=[]对于范围内的i(M):对于范围内的j(N):如果(Img(i,j)==1):没有\u对象=N0\u对象+1索引=[((j-1)*M+i)]连接的(索引)=标记,而(索引!=0):Img(索引)=0个邻居=bsxfun(@plus,Index,offset)邻居=唯一的(邻居(:)索引=邻居(查找(图像(邻居)))连接(索引)=标记标记=标记+差异我可以使用什么替代of@plus用python?