图像像素中的 DFS
Dfs in image pixel
我正在用这个图像练习DFS,我想计算图像中的白点
但dfs最终是这样的
def dfs(img,j,i,width,height):
print(j,i)
if j < 0 or i< 0 or j>= height or i>= width or (img[j,i,0] == 0 and img[j,i,1] == 0 and img[j,i,2] == 0):
cv2.imshow("hi",img)
cv2.waitKey(0)
return
img[j,i,0] = 0
img[j,i,1] = 0
img[j,i,2] = 0
dfs(img,j+1,i,width,height)
dfs(img,j-1,i,width,height)
dfs(img,j,i+1,width,height)
dfs(img,j,i-1,width,height)
if __name__ == "__main__":
img = cv2.imread(r"D:\secret\Problem3\test2-gray.bmp")
count = 0
img = cv2.resize(img, (400, 400), interpolation=cv2.INTER_CUBIC)
og_img = img.copy()
width,height = img.shape[0],img.shape[1]
for j in range(height):
for i in range(width):
if (img[j,i] >0).all():
count += 1
dfs(img,j,i,width,height)
cv2.imshow("hi",img)
cv2.waitKey(0)
我认为dfs中的结束语句有问题,但无法弄清楚,有人可以给我提示吗?谢谢!
我认为问题在于您重新访问了已经处理过的像素。由于您将它们设置为“0”(黑色),因此 dfs
函数 returns 在访问所有白色像素之前。
尝试使用 set()
或其他东西来跟踪已经访问过的像素,然后检查每个像素是否已经在集合中。
循环示例:
for j in range(height):
for i in range(width):
visited_pixels = set()
if (img[j,i] >0).all():
count += 1
visited_pixels.add((j, i))
dfs(img,j,i,width,height, visited_pixels)
然后,在函数中:
def dfs(img,j,i,width,height, visited_pixels):
if (j, i) in visited_pixels:
return
if (your_if_statement)
...
visited_pixels.add(j, i)
您达到了 Python 的递归限制。您可以尝试将其设置得更高
https://docs.python.org/3/library/sys.html#sys.setrecursionlimit
但更好的选择是自己处理递归堆栈,例如:
def dfs(img,j,i,width,height):
todo = [(j,i)]
while todo:
j,i = todo.pop()
if not (0 <= j < height) or not (0 <= i < width) or (img[j,i] == 0).all():
continue
img[j,i,0] = 0
img[j,i,1] = 0
img[j,i,2] = 0
sz += 1
todo += [(j+1,i), (j-1,i), (j,i+1), (j,i-1)]
我正在用这个图像练习DFS,我想计算图像中的白点
但dfs最终是这样的
def dfs(img,j,i,width,height):
print(j,i)
if j < 0 or i< 0 or j>= height or i>= width or (img[j,i,0] == 0 and img[j,i,1] == 0 and img[j,i,2] == 0):
cv2.imshow("hi",img)
cv2.waitKey(0)
return
img[j,i,0] = 0
img[j,i,1] = 0
img[j,i,2] = 0
dfs(img,j+1,i,width,height)
dfs(img,j-1,i,width,height)
dfs(img,j,i+1,width,height)
dfs(img,j,i-1,width,height)
if __name__ == "__main__":
img = cv2.imread(r"D:\secret\Problem3\test2-gray.bmp")
count = 0
img = cv2.resize(img, (400, 400), interpolation=cv2.INTER_CUBIC)
og_img = img.copy()
width,height = img.shape[0],img.shape[1]
for j in range(height):
for i in range(width):
if (img[j,i] >0).all():
count += 1
dfs(img,j,i,width,height)
cv2.imshow("hi",img)
cv2.waitKey(0)
我认为dfs中的结束语句有问题,但无法弄清楚,有人可以给我提示吗?谢谢!
我认为问题在于您重新访问了已经处理过的像素。由于您将它们设置为“0”(黑色),因此 dfs
函数 returns 在访问所有白色像素之前。
尝试使用 set()
或其他东西来跟踪已经访问过的像素,然后检查每个像素是否已经在集合中。
循环示例:
for j in range(height):
for i in range(width):
visited_pixels = set()
if (img[j,i] >0).all():
count += 1
visited_pixels.add((j, i))
dfs(img,j,i,width,height, visited_pixels)
然后,在函数中:
def dfs(img,j,i,width,height, visited_pixels):
if (j, i) in visited_pixels:
return
if (your_if_statement)
...
visited_pixels.add(j, i)
您达到了 Python 的递归限制。您可以尝试将其设置得更高 https://docs.python.org/3/library/sys.html#sys.setrecursionlimit 但更好的选择是自己处理递归堆栈,例如:
def dfs(img,j,i,width,height):
todo = [(j,i)]
while todo:
j,i = todo.pop()
if not (0 <= j < height) or not (0 <= i < width) or (img[j,i] == 0).all():
continue
img[j,i,0] = 0
img[j,i,1] = 0
img[j,i,2] = 0
sz += 1
todo += [(j+1,i), (j-1,i), (j,i+1), (j,i-1)]