我目前正在使用 Python 对单个图像进行颜色检测。加载我的图像并建立我的 RGB(或 CV2 中的 BGR)后,我使用以下 2 行来生成蒙版和输出图像。
mask = cv2.inRange(image, lower, upper)
output = cv2.bitwise_and(image, image, mask = mask)
然后代码显示下图。
但现在,我想获取处理后的图像并提取绿线的像素坐标点。
谢谢。任何帮助,将不胜感激。
我目前正在使用 Python 对单个图像进行颜色检测。加载我的图像并建立我的 RGB(或 CV2 中的 BGR)后,我使用以下 2 行来生成蒙版和输出图像。
mask = cv2.inRange(image, lower, upper)
output = cv2.bitwise_and(image, image, mask = mask)
然后代码显示下图。
但现在,我想获取处理后的图像并提取绿线的像素坐标点。
谢谢。任何帮助,将不胜感激。
那么,在图像的二值化版本上 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.
我的解决方案不是那么整洁,但您可以稍后对其进行改进。
我在黑色图像上画了一条线:
我已经获得了那些白色像素的坐标值。我拿了两个数组来存储它们。
代码:
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)
我知道那里有更好的方法。一旦我弄清楚,我会更新这个答案。