如何找到下方红色线的坐标

时间:2019-06-19 15:28:10

标签: python opencv image-processing

enter image description here

我正在尝试使用opencv_python查找下方的红线的坐标。

我已经找到了这条红线的轮廓和所有坐标。但是我只需要下部红线的坐标,而不需要封闭的灰色区域上方的红线。

def find_drawContours(path):                        
   src = cv2.imread(path)                          
   # cv2.imshow('input', src)                      
   src = cv2.GaussianBlur(src, (3,3), 0)           
   # cv2.imshow('', src)                           
   gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)    
   ret, binary = cv2.threshold(gray, 0, 255, cv2.TH
   # cv2.imshow('binary', binary)                  

   image, contours, hierachy = cv2.findContours(bin
   for i in range(len(contours)):                  
       mm = cv2.moments(contours[i])               
       m00 = mm['m00']                             
       m10 = mm['m10']                             
       m01 = mm['m01']                             
       cx = np.int(m10/m00)                        
       cy = np.int(m01/m00)                        
       (x, y), (a, b), degree = cv2.fitEllipse(cont
       cv2.circle(src, (cx, cy), 2, (0,0,255), -1, 
       cv2.drawContours(src, contours, i, (0, 0, 25
   pix_list = []                                   
   for i in range(len(contours[0])):               
       a = contours[0][i]                          
       pix_list.append(a[0])                       
   pix_array = np.array(pix_list)                  
   print(min(pix_array[...,0]))                    
   # cv2.imwrite('img/res.contour.jpg',src)  

enter image description here

1 个答案:

答案 0 :(得分:0)

我在图像上看到一个分散的红点,为了使以下技术起作用,我将使用膨胀和腐蚀操作将其消除。清理之后,我会:

  1. 沿每列(x轴)扫描,如果该列上只有两个红色点,请找到y坐标较高的点并将其添加到列表中{{ 1}}。
  2. 扫描完图像的所有列后,points_on_lower_line[]将具有所有属于较低红线的点。您可以通过确保所有点都是4连接来进一步清理。

由于已经存储了轮廓点,因此您甚至不必绘制轮廓并扫描图像中的红色像素。您可以按点的x坐标对轮廓列表进行排序,并通过检查是否只有两个点具有相同的x坐标并存储较低的点(较高的y坐标)来过滤列表。结果列表将包含下部红线的点。

您也可以使用集合来避免对轮廓点进行排序:

points_on_lower_line