我有一张弯曲纬度线的地图。我能够检测出一些经度线。我使用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)**
答案 0 :(得分:0)
我只有两个想法而没有代码: - )
第一个想法:经度线在我看来是直线,因此HoughLines
应该足够好。你写的纬度线不直,也许你可以找到一个解析表达式(有合适的参数,现在你只有rho
和theta
的直线,我想你需要更多参数)对于他们然后尝试应用霍夫变换,也许你必须自己编码。
如果纬度线是圆形的,您可以使用HoughCircles
来检测它们,或者您也可以使用有关edges
中边缘垂直位置的信息,以便在你正在寻找的(圆弧)。
第二个想法:您可以尝试在合适的色彩空间中工作,而不是使用灰色图像,以便使用经度和纬度线与背景颜色不同的信息。 / p>