地图检测中的Python OpenCV纬度曲线

时间:2015-11-24 20:14:22

标签: python opencv computer-vision

我有一张弯曲纬度线的地图。我能够检测出一些经度线。我使用HoughlineP来检测线条。我的目标是检测纬度和经度线并找到交叉点。问题是纬度线跟随更大的圆并且在更高的海拔(前北40度)弯曲。地形特征也让Houghline很难找到正确的线条。我正在寻找任何Python包中更好的曲线检测算法。

这是源图像: c_6.jpg

以下是我使用的代码:

import cv2
import numpy as np

def draw_lines(hough, image, nlines):
  n_x, n_y=image.shape
  #convert to color image so that you can see the lines
  draw_im = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)

  for (rho, theta) in hough[0][:nlines]:
   try:
     x0 = np.cos(theta)*rho
     y0 = np.sin(theta)*rho
     pt1 = ( int(x0 + (n_x+n_y)*(-np.sin(theta))),
             int(y0 + (n_x+n_y)*np.cos(theta)) )
     pt2 = ( int(x0 - (n_x+n_y)*(-np.sin(theta))),
             int(y0 - (n_x+n_y)*np.cos(theta)) )
     alph = np.arctan( (pt2[1]-pt1[1])/( pt2[0]-pt1[0]) )
     alphdeg = alph*180/np.pi
     #OpenCv uses weird angle system, see: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html
     if abs( np.cos( alph - 180 )) > 0.8: #0.995:
        cv2.line(draw_im, pt1, pt2, (255,0,0), 2)
     if rho>0 and abs( np.cos( alphdeg - 90)) > 0.7:
        cv2.line(draw_im, pt1, pt2, (0,0,255), 2)    
  except:
     pass
 cv2.imwrite("/home/dino/Desktop/3HoughLines.png", draw_im,
         [cv2.IMWRITE_PNG_COMPRESSION, 12])   

 img = cv2.imread('c_6.jpg')
 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

 flag,b = cv2.threshold(gray,160,255,cv2.THRESH_BINARY)
 cv2.imwrite("1tresh.jpg", b)

element = np.ones((3,3))
b = cv2.erode(b,element)
cv2.imwrite("2erodedtresh.jpg", b)

edges = cv2.Canny(b,10,100,apertureSize = 3)
cv2.imwrite("3Canny.jpg", edges)

hough = cv2.HoughLines(edges, 1, np.pi/180, 200)   
draw_lines(hough, b, 100)**

1 个答案:

答案 0 :(得分:0)

我只有两个想法而没有代码: - )

第一个想法:经度线在我看来是直线,因此HoughLines应该足够好。你写的纬度线不直,也许你可以找到一个解析表达式(有合适的​​参数,现在你只有rhotheta的直线,我想你需要更多参数)对于他们然后尝试应用霍夫变换,也许你必须自己编码。

如果纬度线是圆形的,您可以使用HoughCircles来检测它们,或者您也可以使用有关edges中边缘垂直位置的信息,以便在你正在寻找的(圆弧)。

第二个想法:您可以尝试在合适的色彩空间中工作,而不是使用灰色图像,以便使用经度和纬度线与背景颜色不同的信息。 / p>