Как получить значения пикселей в определенной области?

поэтому, поскольку я относительно новичок в программировании, мне понадобится небольшая помощь с этой проблемой. Я использую SimpleCV с Python 2.7 на компьютере с Windows. Что я пытаюсь сделать, так это получить (самостоятельно написанную) программу, которая сообщает мне значения пикселей вдоль заданной линии, наиболее важным здесь будет цвет каждого пикселя.

Я действительно не знаю, с чего начать, так как я нашел только примеры, где запрашивались значения одного пикселя.

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

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

Это предварительно написанный код, который я сейчас использую для отслеживания объектов:

print __doc__

import SimpleCV

display = SimpleCV.Display()
cam = SimpleCV.Camera()
normaldisplay = True

while display.isNotDone():

    if display.mouseRight:
         normaldisplay = not(normaldisplay)
         print "Display Mode:", "Normal" if normaldisplay else "Segmented" 

img = cam.getImage().flipHorizontal()
dist = img.colorDistance(SimpleCV.Color.BLACK).dilate(2)
segmented = dist.stretch(200,255)
blobs = segmented.findBlobs()
if blobs:
    circles = blobs.filter([b.isCircle(0.2) for b in blobs])
    if circles:
        img.drawCircle((circles[-1].x, circles[-1].y), circles[-1].radius(),SimpleCV.Color.BLUE,3)

if normaldisplay:
    img.show()
else:
    segmented.show()

вот снимок отслеживаемого объекта

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

У кого-нибудь может быть идея, как подойти к этой проблеме? Благодарю вас!


person Jennan    schedule 03.08.2016    source источник
comment
Можете ли вы поделиться некоторыми примерами входных снимков, тогда было бы намного проще получить решение.   -  person ZdaR    schedule 03.08.2016
comment
Конечно! Я добавлю это к вопросу, дайте мне секунду!   -  person Jennan    schedule 03.08.2016


Ответы (1)


Допустим, у вас есть центр (x0, y0). Вы хотите перебрать пиксели по радиусу, идущему от (x0, y0) до (x1, y1), который является точкой на окружности.

В C++ вы можете использовать LineIterator для этой цели. Однако я не нашел его для python...

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

  • Создайте черную бинарную маску размером с ваше изображение
  • Нарисуйте свою линию на этой маске
  • Найдите все нечерные пиксели, используя ненулевую функцию NumPy .
  • У вас есть пиксели вашей линии (хотя они не упорядочены)
  • Упорядочить их в зависимости от их удаленности от центра.

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

person Sunreef    schedule 03.08.2016
comment
Спасибо за это объяснение, оно мне очень помогает! - person Jennan; 04.08.2016