通常来说有两种方法,Two-Pass算法和Seed-Filling算法。前者是通过遍历两次图像,将图像中存在的所有联通区域找出来并标记;后者是源于计算机图形学对于某个图形进行填充,其思路是区域生长算法。想了解更具体的原理自己去搜资料吧,我懒。其实现在skimage或者opencv库都有相应的封装函数,但是一向喜欢造轮子的我喜欢手撕,最重要的,我可以根据业务需要随时进行改动源码。废话不多说,上源码,我知道这就是你们来csdn的原因。。。代码只是基本的思路实现,加速啥的自己做吧。
import cv2
import numpy as np
import sys
import matplotlib.pyplot as plt
N_hoods_4=True
N_hoods_8=False #尽可能少定义全局变量,在python里会让代码速度变慢;固定参数较多,可以考虑写成config文件导入使用;
OFFSETS_4=[[0,-1],[0,0],[1,0],[0,1]]
OFFSETS_8=[[-1,-1],[0,-1],[1,-1],
[-1,0],[0,0],[1,0],
[-1,1],[0,1],[1,1]]
def Research(img:np.array):
index_List=[]
points_List=[]
index=-1
assert(img.shape[2]==1)
h,w=img.shape
for i in range(h):
for j in range(w): #使用for循环比while要高效