带方向的范洪填充算法速度比较快

范洪填充算法就是画图中的油漆桶工具.
这里是python版的实现.




@jit(nopython=True)
def ViralInfection(img, x:int, y:int):
    '''
    病毒感染传播算法 
    算法原理 
        依某一点为中心逐渐扩大感染范围
        先从一个点向一个方向使劲的感染, 每个被感染的细胞加入到病毒源中. 传播方向是垂直的.
        
    '''
    
    #病毒源的点位
    viralSrcPoints = List() # List() #queue.Queue() 
    v = img[x,y]
    viralSrcPoints.append((x,y,Way.Left))   # 作为种子, 既要左右传播也要上下传播
    viralSrcPoints.append((x,y,Way.Right))  # 作为种子, 既要左右传播也要上下传播
    viralSrcPoints.append((x,y,Way.Top))    # 作为种子, 既要左右传播也要上下传播
    viralSrcPoints.append((x,y,Way.Bottom)) # 作为种子, 既要左右传播也要上下传播

    # plt.show(False)
    # deadvirals = set() # 被传染过的点, 为了提高性能

    while(True): 
        if(len(viralSrcPoints) == 0):
            # return deadvirals
            return
        
        p = viralSrcPoints.pop()
        # del viralSrcPoints[0] # 取得之后删掉第0个. 就是先进先出的 Queue

        if(p is None):
            # return deadvirals
            return
        xi = p[0]
        yi = p[1]
        way = p[2] # 向哪个方向传播

        # v = p[2]
        # if (v >= 0):
        #     continue# 确保扫描的都是负数为中心开始扫描的, 而不是正数开始扫描
 
        # 取得十字坐标的上下左右8个位置的坐标索引.
        # crossindex = GetSudokuIndex(x,y)
        # 上下左右8个点依次判断是否跟当前区域相同的色彩值,如果相同的就传染,并作为下一个传染点.
        # for xi,yi in crossindex:
            
        while(True): # 沿着一个方向一直扫描. 索引越界问题使用图像外层加边框的方式进行杜绝, 可减少很多的判断.
            # 沿着方向前进
            if(way == Way.Left): 
                xi = xi-1
            elif(way == Way.Right):
                xi = xi+1
            elif(way == Way.Top):
                yi = yi-1
            elif(way == Way.Bottom):
                yi = yi+1
            #2. 判断当前像素是否可以被感染
            if (img[xi,yi] == -v or img[xi,yi] == v): #感染条件  如果相邻颜色和中心点颜色相反那么会被感染
                #  img[xi,yi]  = v #被感染,  下面直接清除了,所以这里就放弃感染,直接死翘翘
                img[xi,yi]  = 0 # 然后被清除成0 
                #3. 被感染的细胞,则会再去感染另外两个方向上的细胞.
                if(way == Way.Left or way == Way.Right ):
                        viralSrcPoints.append((xi,yi,Way.Top))
                        viralSrcPoints.append((xi,yi,Way.Bottom))
                elif(way == Way.Top or way == Way.Bottom ):
                        viralSrcPoints.append((xi,yi,Way.Left))
                        viralSrcPoints.append((xi,yi,Way.Right))
            else:
                break #停止线性扫描,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值