Ваша ошибка находится в пределах проверки диапазона в нижней половине. Давайте посмотрим на арифметику для строки 42 ...
if (i > len(image)/2 and
j >= len(image[i])/2 - (i + 1) and
j <= len(image[i])/2 - i):
Подставляя правильные значения, имеем:
if (42 > 40 and
j >= 40 - (42 + 1) and
j <= 40 - 42):
Последнее условие не может быть выполнено: вам нужно вычесть номер строки из средней точки и принять абсолютное значение. Еще проще, просто установите значения вашего цикла прямо в нужные вам диапазоны:
row_mid = len(image) // 2
col_mid = len(image[0]) // 2
for row in range(row_mid):
for col in range(col_mid-row, col_mid+row):
print(row, col)
ret[row, col] = 1
for tmp in range(row_mid):
row = len(image) - tmp # Work from the bottom up
for col in range(col_mid-tmp, col_mid+tmp):
ret[row, col] = 1
Вывод для массива 10x10:
0000000000
0000110000
0001111000
0011111100
0111111110
0000000000
0111111110
0011111100
0001111000
0000110000
Я доверю тебе, чтобы скорректировать граничные условия. : -)