我有以下图片:
我想找出线来做一些计算,平均长度等等。。。
我试图使用HoughLinesP
,但它找不到行。我该怎么办?在
这是我的代码:
sk=skeleton(mask);
rows, cols = sk.shape
imgOut=np.zeros((rows,cols,3),np.uint8)
imgOut[:,:,0]=0
imgOut[:,:,1]=0
imgOut[:,:,2]=0
minLineLength = 0
maxLineGap = 0
lines = cv2.HoughLinesP(sk,1,np.pi/180,100,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
cv2.line(imgOut,(x1,y1),(x2,y2),(0,255,0),2)
print len(lines[0])
cv2.imshow('skel',sk)
cv2.imshow('Line',imgOut)
cv2.imwrite('Out.bmp',imgOut)
输出:
如果我改变HoughLinesP
的参数,我只得到线的片段,而不是实线。在
尽管Hough-lines算法只用于直线(而且您显然在处理曲线),但是有一种方法可以挽救您的尝试,方法是大大增加}参数。在
rho
和{这应该使曲线边指向同一个箱子,而不是在不同的箱子里分开。在
编辑: 您有一点问题:OpenCV对
cv2.HoughLinesP
的定义。从documentation:如您所见,第5个参数是输出变量
lines
。 你的电话是因此,给定的
minLineLength
参数没有效果(它变成了一个输出变量),而且maxLineGap
的解释也有错误。在我建议显式地写参数名(还没有参数调整)
^{pr2}$写起来有点长,但至少OpenCV不再混合参数了
可视化线条
我更改了每一行的线条颜色,以便更容易地可视化哪一段是在哪里:
更改参数
通过减少
rho
和theta
(通过增加参数来实现),您将有更多的机会让曲线的边缘投票给同一行bin。在下面是一些尝试(下面是完整的代码)
显示的行太多。降低参数
为什么是骷髅?在
您的输入图像(如给定)看起来已经存在边。
skeletonize
的输出只是边缘的中心线,这听起来是件好事,但对于Hough线来说,这意味着要减少线段“投票”的像素数。在这在细节上没有太大变化,但我认为这不会影响手头的任务。在
为什么不贴标签?在
你想得到的是单独的线段。为什么不给图像贴上标签呢?在
通过应用一些形态学算子,你将得到单独的线,或者在最坏的情况下,线分支。在
现在您可以通过
将Hough线应用到这些问题上可能会有点过火,但是你已经很好地解决了你的问题。在
度量的计算现在非常简单(参见ndimage.measurement文档),数组上的迭代也非常简单。在
相关问题 更多 >
编程相关推荐