Другое решение, которое работает для меня:
Позволяет иметь сетку, например:
grid=[[0, 6, 8, 2, 2, 5, 25, 24, 11],
[4, 15, 3, 22, 225, 1326, 2814, 1115, 18],
[6, 10, 9, 201, 3226, 3549, 3550, 3456, 181],
[42, 24, 46, 1104, 3551, 3551, 3551, 3382, 27],
[9, 7, 73, 2183, 3551, 3551, 3551, 3294, 83],
[9, 7, 5, 669, 3544, 3551, 3074, 1962, 18],
[10, 3545, 9, 10, 514, 625, 16, 14, 5],
[5, 6, 128, 10, 8, 6, 7, 40, 4]]
Мы строим ее:
plt.pcolormesh(grid)
Предположим, что мы хотим окружить каждый пиксель значением больше 1420. Мы создаем логический массив:
threshold=1420
booleangrid=np.asarray(grid)>threshold
intgrid=booleangrid*1
Затем мы создаем отрезок линии вокруг каждого пикселя:
down=[];up=[];left=[];right=[]
for i, eachline in enumerate(intgrid):
for j, each in enumerate(eachline):
if each==1:
down.append([[j,j+1],[i,i]])
up.append([[j,j+1],[i+1,i+1]])
left.append([[j,j],[i,i+1]])
right.append([[j+1,j+1],[i,i+1]])
и соедините их вместе:
together=[]
for each in down: together.append(each)
for each in up: together.append(each)
for each in left: together.append(each)
for each in right: together.append(each)
(Создано отдельно для ясности.)
Мы проходим эти отдельные отрезки линии, оставляя только те, которые появляются только один разт. е. те, которые находятся на краю объекта, определенного логическим массивом (booleangrid
), который мы определили выше:
filtered=[]
for each in together:
c=0
for EACH in together:
if each==EACH:
c+=1
if c==1:
filtered.append(each)
Затем мы строим сетку и отдельные сегменты линии с помощью цикла for:
plt.pcolormesh(grid)
for x in range(len(filtered)):
plt.plot(filtered[x][0],filtered[x][1],c='red', linewidth=8)
дает нам результат:
С которым мы можем быть счастливы.