Поскольку вы не указываете, что они должны быть квадратными, или налагаете какие-либо другие ограничения, кроме «десяти равных частей», почему бы вам просто не нарезать изображение на (для вашего примера) десяти изображений 80 * 800 ( или 800 * 80, если вы хотите нарезать в другом измерении)?
Это даст десять кусков одинакового размера, не беспокоясь о том, есть ли у вас оптимальные квадраты и так далее. Если вариант использования просто нарезать на равные части (например, изображение, идущее по проводам из сети, где десять небольших запросов могут казаться более отзывчивыми, чем один большой), это будет работать нормально.
Другими словами, что-то вроде:
def getSlice (sliceNumber, sliceCount, image):
xpos = 0
xsize = image.xsize
ypos = sliceNumber * image.ysize / sliceCount
ypos2 = (sliceNumber + 1) * image.ysize / sliceCount
if sliceNumber < sliceCount - 1:
ysize = ypos2 - ypos1
else:
ysize = image.ysize - ypos1 - 1
return image.subImage (xpos, ypos, xsize, ysize)
При вызове с пятью ломтиками вы получите:
+-------------------------------------------+
| getSlice (0, 5, image) |
+-------------------------------------------+
| getSlice (1, 5, image) |
+-------------------------------------------+
| getSlice (2, 5, image) |
+-------------------------------------------+
| getSlice (3, 5, image) |
+-------------------------------------------+
| getSlice (4, 5, image) |
+-------------------------------------------+
Вещи ypos/ypos2
и оператор if
в конце предназначены для ситуаций, когда подразделения не могут давать идеально выровненные числа. Они должны гарантировать, что вы не будете дублировать или пропускать какие-либо строки на изображении.