У меня нет времени, чтобы сделать полный ответ, как обычно, но я чувствовал, что хотел бы внести несколько битов и подсказок, и никто не сказал, что ответы должны быть полными в любом случае.
Шаг 1 - Обрезать черным, чтобы найти радиус
Вы можете обрезать черные пиксели и получить квадрат с кружком, который вы хотите вписать в середину. Вы можете сделать это, используя numpy
, чтобы проверить, все ли элементы в строке / столбце изображения / ndarray равны нулю, а затем вырезать их.
Или вы можете использовать этот метод .
Если у вас есть квадрат, если вы возьмете половину его ширины, вы узнаете радиус, а также координаты центра вашего круга.
![enter image description here](https://i.stack.imgur.com/a9qKm.png)
Шаг 2 - Создание масок
Нарисуйте кусочки пирога, чтобы замаскировать пиксели, которые вы хотите. Я рисую 3 среза, чтобы продемонстрировать, как двигаться по кругу, но вам понадобится только один по одному за раз.
Вот код для рисования первых нескольких кусочков пирога, которые можно использовать для маскировки нужных вам частей:
#!/usr/local/bin/python3
import PIL.ImageDraw as ImageDraw,PIL.Image as Image, PIL.ImageShow as ImageShow
im = Image.new("RGB", (400,400))
draw = ImageDraw.Draw(im)
sectors=8
angle=360/sectors
# Draw first sector bright white - fill colour is rgb(255,255,255)
startangle=-90
draw.pieslice((0,0,400,400),startangle,startangle+angle,fill=(255,255,255))
# Draw second sector slightly darker
startangle+=angle
draw.pieslice((0,0,400,400),startangle,startangle+angle,fill=(223,223,223))
# Draw third sector slightly darker still
startangle+=angle
draw.pieslice((0,0,400,400),startangle,startangle+angle,fill=(192,192,192))
im.show()
![enter image description here](https://i.stack.imgur.com/N3mFc.png)
Очевидно, что в вашем готовом коде этот шаг будет началом цикла for
по всем восьми слайсам, и вы будете делать по одному слайсу за раз.
Шаг 3 - Применить маски
Итак, если вы сейчас сделаете снимок маски следующим образом:
![enter image description here](https://i.stack.imgur.com/p8Hi9.png)
и инвертируйте (отрицайте) его, затем наложите на оригинал, выбрав более светлое из двух изображений в каждой точке пикселя, вы получите это (я искусственно добавил черную рамку, чтобы вы могли видеть ее масштаб) :
![enter image description here](https://i.stack.imgur.com/KfxMr.png)
Вы можете выбрать более яркий пиксель с помощью numpy.maximum()
, как показано здесь .
Шаг 4 - Подсчет желаемых пикселей
Теперь можно надеяться, что вы подсчитаете черные (т.е. нулевые) пиксели или белые и вычтете из области всей фигуры.
Эта ссылка указывает путь. Есть и другие.