разделить изображение на спицы и рассчитать количество черных пикселей в каждой спице - PullRequest
0 голосов
/ 05 июля 2018

В python я пытаюсь разделить изображение на спицы и рассчитать количество черных пикселей в каждой спице. Конечной целью является создание коэффициента обзора неба для изображения, но любая помощь по разделению на Спицы (треугольники круга вокруг центра изображения) была бы очень признательна.

Например, у меня есть изображение, полученное с помощью объектива типа «рыбий глаз», полусферическое изображение (на рисунке ниже), и я хочу разделить изображение круга на треугольники вокруг центра (как спицы в колесе или кусочки пиццы)

круг, разделенный на треугольники, такие как кусочки пиццы или спицы вокруг колеса

Круг не всегда может быть в одном и том же месте на изображении и не будет первоначально разделен на линии, поскольку это будет полусферическое изображение неба. Так что в качестве примера изображение будет выглядеть примерно так:

пример изображения без разделительных линий

Независимо от того, где находится круг, мне потребуется одинаковое количество сегментов, например, 8

1 Ответ

0 голосов
/ 05 июля 2018

У меня нет времени, чтобы сделать полный ответ, как обычно, но я чувствовал, что хотел бы внести несколько битов и подсказок, и никто не сказал, что ответы должны быть полными в любом случае.

Шаг 1 - Обрезать черным, чтобы найти радиус

Вы можете обрезать черные пиксели и получить квадрат с кружком, который вы хотите вписать в середину. Вы можете сделать это, используя numpy, чтобы проверить, все ли элементы в строке / столбце изображения / ndarray равны нулю, а затем вырезать их.

Или вы можете использовать этот метод .

Если у вас есть квадрат, если вы возьмете половину его ширины, вы узнаете радиус, а также координаты центра вашего круга.

enter image description here

Шаг 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

Очевидно, что в вашем готовом коде этот шаг будет началом цикла for по всем восьми слайсам, и вы будете делать по одному слайсу за раз.

Шаг 3 - Применить маски

Итак, если вы сейчас сделаете снимок маски следующим образом:

enter image description here

и инвертируйте (отрицайте) его, затем наложите на оригинал, выбрав более светлое из двух изображений в каждой точке пикселя, вы получите это (я искусственно добавил черную рамку, чтобы вы могли видеть ее масштаб) :

enter image description here

Вы можете выбрать более яркий пиксель с помощью numpy.maximum(), как показано здесь .

Шаг 4 - Подсчет желаемых пикселей

Теперь можно надеяться, что вы подсчитаете черные (т.е. нулевые) пиксели или белые и вычтете из области всей фигуры.

Эта ссылка указывает путь. Есть и другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...