Маска обнаружения цвета Python Open CV2 для координат пикселей

В настоящее время я работаю в Python, чтобы определить цвет на одном изображении. После загрузки моего изображения и установки моего RGB (или BGR в CV2) я использую следующие 2 строки для создания маски и выходного изображения.

mask = cv2.inRange(image, lower, upper)
output = cv2.bitwise_and(image, image, mask = mask)

Затем код отображает следующее изображение.

Вывод моего определения цвета

Но теперь я хотел бы взять обработанное изображение и извлечь точки координат пикселей для зеленой линии.

Спасибо. Любая помощь будет оценена по достоинству.


person Joshua Jenkins    schedule 24.01.2017    source источник
comment
Итак, чтобы было ясно, у вас есть изображение, которое вы разместили, и вам нужны координаты пикселей в зеленой строке? (ваш фрагмент кода меня немного смущает, это не часть проблемы, не так ли?)   -  person Soltius    schedule 26.01.2017
comment
Изображение, которое вы разместили, является исходным изображением рядом с результатом, верно?   -  person Soltius    schedule 26.01.2017


Ответы (2)


Итак, как насчет findNonZeros() в бинарной версии вашего изображения? Начиная с изображения с зеленой линией на черном фоне:

import cv2
import numpy as np

img = cv2.imread(output.png)
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #converting to grayscale
img = img.astype(np.uint8)

#get all non zero values
coord = cv2.findNonZero(img)

РЕДАКТИРОВАТЬ: На другой вопрос было указано, что вы также можете использовать ненулевые функции numpy. Это дает те же результаты, но я считаю, что это медленнее

import cv2
import numpy as np
import time 

so=cv2.imread(your_image,0)

start1=time.clock()
coord=cv2.findNonZero(so)
end1=time.clock()

start2=time.clock()
coord2=np.nonzero(so)
end2=time.clock()

print("cv2.findNonZeros() takes "+str(end1-start1)+" seconds.")
print("np.nonzero() takes       "+str(end2-start2)+" seconds.")

>>> cv2.findNonZeros() takes 0.003266 seconds.
>>> np.nonzero() takes       0.021132 seconds.
person Soltius    schedule 26.01.2017

Мое решение не такое аккуратное, но вы можете доработать его позже.

Я провел линию по черному изображению:

введите здесь описание изображения

И я получил значения координат этих пикселей в белом цвете. Я взял два массива для их хранения.

Код:

listi = []    #---stores coordinate corresponding to height of the image
listj = []    #---stores coordinate corresponding to width of the image

for i in range(0, mask.shape[0]):
    for j in range(0, mask.shape[1]):
        if(mask[i, j] == 255):
            listi = np.append(listi, i)
            listj = np.append(listj, j)

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

person Jeru Luke    schedule 26.01.2017