3

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

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

然后代码显示下图。

我的颜色检测的输出

但现在,我想获取处理后的图像并提取绿线的像素坐标点。

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

4

2 回答 2

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.
于 2017-01-26T12:49:14.523 回答
0

我的解决方案不是那么整洁,但您可以稍后对其进行改进。

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

在此处输入图像描述

我已经获得了那些白色像素的坐标值。我拿了两个数组来存储它们。

代码:

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)

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

于 2017-01-26T10:55:20.130 回答