在骨骼图像中查找线条OpenCV python

2024-09-28 23:16:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下图片:

我想找出线来做一些计算,平均长度等等。。。 我试图使用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的参数,我只得到线的片段,而不是实线。在


Tags: npcv2rowssklinesx1x2cols
1条回答
网友
1楼 · 发布于 2024-09-28 23:16:21

尽管Hough-lines算法只用于直线(而且您显然在处理曲线),但是有一种方法可以挽救您的尝试,方法是大大增加rho和{}参数。在

这应该使曲线边指向同一个箱子,而不是在不同的箱子里分开。在


编辑: 您有一点问题:OpenCV对cv2.HoughLinesP的定义。从documentation

cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])

如您所见,第5个参数是输出变量lines。 你的电话是

cv2.HoughLinesP(sk,1,np.pi/180,100,minLineLength,maxLineGap)
                                   ^^^^^^^^^^^^^
                                   lines         

因此,给定的minLineLength参数没有效果(它变成了一个输出变量),而且maxLineGap的解释也有错误。在

我建议显式地写参数名(还没有参数调整)

^{pr2}$

写起来有点长,但至少OpenCV不再混合参数了

可视化线条

我更改了每一行的线条颜色,以便更容易地可视化哪一段是在哪里:

    color = np.random.uniform(0,255,3)
    cv2.line(imgOut,(x1,y1),(x2,y2),color,2)

更改参数

通过减少rhotheta(通过增加参数来实现),您将有更多的机会让曲线的边缘投票给同一行bin。在

下面是一些尝试(下面是完整的代码)

rho=5,theta=np.deg2rad(10),threshold=10,minLineLength=5,maxLineGap=2

Too many lines 显示的行太多。降低参数

为什么是骷髅?在

您的输入图像(如给定)看起来已经存在边。skeletonize的输出只是边缘的中心线,这听起来是件好事,但对于Hough线来说,这意味着要减少线段“投票”的像素数。在

# sk = skeletonize(mask==255)
sk = mask==255

这在细节上没有太大变化,但我认为这不会影响手头的任务。在

为什么不贴标签?在

你想得到的是单独的线段。为什么不给图像贴上标签呢?在

from matplotlib import pyplot as plt
from scipy import ndimage 

labels,nblabels = ndimage.label(sk)
plt.imshow(labels,'jet')
plt.show()

Labelled image

通过应用一些形态学算子,你将得到单独的线,或者在最坏的情况下,线分支。在

现在您可以通过

line = labels == 2 # select the pixels with label 2 only

将Hough线应用到这些问题上可能会有点过火,但是你已经很好地解决了你的问题。在

度量的计算现在非常简单(参见ndimage.measurement文档),数组上的迭代也非常简单。在

相关问题 更多 >