范洪填充算法就是画图中的油漆桶工具.
这里是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 #停止线性扫描,