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