使用python和numpy递归填充图像
我正在做一个基于图像特征提取的项目,我正在使用python和numpy,我不想从库中导入任何其他函数。 我写了一个洪水填充算法的递归实现,这个算法的目标是从一个摩尔的中心开始洪水填充它,为了简单起见,我正在研究标签矩阵。因为鼹鼠里面有一些小孔,我想把它们去掉,我实际上是用鼹鼠的颜色给所有像素着色,这些像素有8个邻居中的4个,这也是平滑边缘,这对我来说是件好事。 这是我的职责使用python和numpy递归填充图像,python,python-3.x,image,numpy,flood-fill,Python,Python 3.x,Image,Numpy,Flood Fill,我正在做一个基于图像特征提取的项目,我正在使用python和numpy,我不想从库中导入任何其他函数。 我写了一个洪水填充算法的递归实现,这个算法的目标是从一个摩尔的中心开始洪水填充它,为了简单起见,我正在研究标签矩阵。因为鼹鼠里面有一些小孔,我想把它们去掉,我实际上是用鼹鼠的颜色给所有像素着色,这些像素有8个邻居中的4个,这也是平滑边缘,这对我来说是件好事。 这是我的职责 def flood_fill(self, posi, posj, targetcolor, color):
def flood_fill(self, posi, posj, targetcolor, color):
"""
recursive function to flood fill the mole starting from its centroids.
"""
if(posi==-1 or posj == -1 or posi == self.N1 or posj == self.N2):
return
if(self.labels[posi][posj] == color):
return
if(self.labels[posi][posj] != targetcolor):
c=0
if(self.labels[posi+1][posj] == targetcolor or self.labels[posi+1][posj] == color):
c+=1
if(self.labels[posi][posj+1] == targetcolor or self.labels[posi][posj+1] == color):
c+=1
if(self.labels[posi-1][posj] == targetcolor or self.labels[posi-1][posj] == color):
c+=1
if(self.labels[posi][posj-1] == targetcolor or self.labels[posi][posj-1] == color):
c+=1
if(self.labels[posi+1][posj+1] == targetcolor or self.labels[posi+1][posj+1] == color):
c+=1
if(self.labels[posi+1][posj-1] == targetcolor or self.labels[posi+1][posj+1] == color):
c+=1
if(self.labels[posi-1][posj-1] == targetcolor or self.labels[posi-1][posj-1] == color):
c+=1
if(self.labels[posi-1][posj+1] == targetcolor or self.labels[posi-1][posj+1] == color):
c+=1
if(c >= 4):
self.labels[posi][posj] = color
return
self.labels[posi][posj] == color
if(posi>self.maxi):
self.maxi = posi
if(posj>self.maxj):
self.maxj = posj
if(posi<self.mini):
self.mini = posi
if(posj<self.minj):
self.minj = posj
self.flood_fill(posi-1, posj, targetcolor, color, count+1)
self.flood_fill(posi+1, posj, targetcolor, color, count+1)
self.flood_fill(posi, posj-1, targetcolor, color, count+1)
self.flood_fill(posi, posj+1, targetcolor, color, count+1)
self.flood_fill(posi+1, posj+1, targetcolor, color, count+1)
self.flood_fill(posi-1, posj+1, targetcolor, color, count+1)
self.flood_fill(posi+1, posj-1, targetcolor, color, count+1)
self.flood_fill(posi-1, posj-1, targetcolor, color, count+1)
return
def flood_fill(self、posi、posj、targetcolor、color):
"""
递归函数,用于从鼹鼠的质心开始填充鼹鼠。
"""
如果(posi=-1或posj=-1或posi==self.N1或posj==self.N2):
返回
如果(self.labels[posi][posj]==颜色):
返回
如果(self.labels[posi][posj]!=targetcolor):
c=0
如果(self.labels[posi+1][posj]==targetcolor或self.labels[posi+1][posj]==color):
c+=1
如果(self.labels[posi][posj+1]==targetcolor或self.labels[posi][posj+1]==color):
c+=1
如果(self.labels[posi-1][posj]==targetcolor或self.labels[posi-1][posj]==color):
c+=1
如果(self.labels[posi][posj-1]==targetcolor或self.labels[posi][posj-1]==color):
c+=1
如果(self.labels[posi+1][posj+1]==targetcolor或self.labels[posi+1][posj+1]==color):
c+=1
如果(self.labels[posi+1][posj-1]==targetcolor或self.labels[posi+1][posj+1]==color):
c+=1
如果(自标签[posi-1][posj-1]==targetcolor或自标签[posi-1][posj-1]==color):
c+=1
如果(self.labels[posi-1][posj+1]==targetcolor或self.labels[posi-1][posj+1]==color):
c+=1
如果(c>=4):
self.labels[posi][posj]=颜色
返回
self.labels[posi][posj]==颜色
如果(posi>self.maxi):
self.maxi=posi
如果(posj>self.maxj):
self.maxj=posj
如果(posiself.flood\u fill(posi-1,posj,targetcolor,color,count+1)
这里您传递了一个额外的参数count+1
,但是您声明的函数定义只有前4个参数。这看起来不像递归。
看看这个。什么是计数?它来自哪里?它是用来做什么的?为什么是flood_fill()用4个参数声明,但用5个参数调用?Count只是我忘记的一个参数。我用它来强制递归停止,这是递归深度——如果希望有人帮忙,恐怕你必须更好地解释代码。没有内联注释,没有解释各种变量(N1、N2、maxi和maxj是干什么的,等等)请对代码进行注释,这样愿意提供帮助的人就不必浪费时间试图找出您可以轻松解释的内容。哦,欢迎使用堆栈溢出。计数只是我忘记的一个参数。我使用它强制递归停止,这是递归深度