Python Open CV2颜色检测蒙版到像素坐标

时间:2017-01-24 19:09:00

标签: python opencv coordinates mask cv2

我目前正在使用Python在单个图像上进行颜色检测。在加载我的图像并建立我的RGB(或CV2中的BGR)之后,我使用以下2行来生成蒙版和输出图像。

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

然后代码显示以下图像。

Output of my color detection

但是现在,我想拍摄处理过的图像并提取绿线的像素坐标点。

感谢。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

那么,对于图像的二值化版本,findNonZeros()怎么样? 从黑色背景上带绿线的图像开始:

import cv2
import numpy as np

img=cv2.imread(output.png)
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #converting to grayscale
img=so.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.

答案 1 :(得分:0)

我的解决方案不是那么整洁,但你可以稍后改进它。

我在黑色图像上划了一条线:

enter image description here

我已经获得 white 中这些像素的坐标值。我已经采用了两个数组来存储它们。

<强>代码:

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)

我知道有更好的方法。一旦我搞清楚,我会更新这个答案。