Здесь остров — это некоторое связанное количество пикселей суши, полностью содержащихся в воде. Есть ли алгоритм, который я могу использовать для автоматического изменения значения любого острова на «0», чтобы все острова были полностью заполнены водой, игнорируя при этом фоновую незанятую землю?
Я До сих пор пробовал несколько подходов, основанных на dfs, но моя рекурсия очень заржавела. Я написал код, который пытается классифицировать пиксели как островные земли или нет. Он делает это путем рекурсивной итерации по пикселям суши до тех пор, пока не будет подтверждено, что они полностью окружены водой. Затем рекурсия разворачивается и в идеале дает «Истина» для каждого из этих пикселей суши острова. Я думаю, что проблема заключается в том, что мои базовые варианты неверны. Я думаю, что проблема заключается в шаге «#был посещен и верна ли земля возвращается». Я считаю, что как только мы попадаем на остров, рекурсивные итерации, происходящие из этого первого пикселя острова, приведут к классификации «Внутри» тогда и только тогда, когда последняя проверенная ячейка полностью окружена водой и уже посещенной сушей. Я также хочу, чтобы все ячейки суши на границе автоматически возвращали значение false, поскольку меня не волнуют острова, выходящие за пределы экрана.
Код следующий:
#1 — это вода, 0 — земля
def isInside(img,x,y):
#img[:][:][1] — это массив того же размера, что и img, где 0 — непосещенный, а 1 — посещенный
dim = img[:,:,0].shape
Код: Выделить всё
#if its outside the border, return false
if(x=dim[1] or y=dim[0]):
return False
#has been visisted and is land returns true
if(img[y][x][1] == 1 and img[y][x][0] == 0):
return True
#is water is true
if (img[y][x][0] == 1):
#mark visisted
img[y][x][1] = 1
return True
#if its land and on the border return false
if ((x==0 or x == dim[1]-1 or y == 0 or y == dim[0]-1) and (img[y][x][0] == 0)):
img[y][x][1] = 1
return False
#is land and unvisited
if img[y][x][0] == 0:
#mark visited
img[y][x][1] = 1
#if all adjacent nodes are water or also inside land, return true
if(isInside(img,x+1,y) and
isInside(img,x-1,y) and
isInside(img,x,y+1) and
isInside(img,x,y-1)):
return True
return False
Подробнее здесь: https://stackoverflow.com/questions/790 ... kes-python