在骨架图像中查找线 OpenCV python

2024-05-23

我有以下图片:

我想找到一些线来进行一些计算,平均长度等...... 我尝试使用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)

Output:

如果我改变参数HoughLinesP我只得到线条片段,而不是实线。


尽管霍夫线算法仅适用于直线(并且您显然正在处理曲线),但可能有一种方法可以通过大大增强rho and theta参数。

这应该使弯曲的边指向同一个垃圾箱,而不是分成不同的垃圾箱。


EDIT: 你有一个问题:OpenCV 的定义cv2.HoughLinesP。来自文档 http://docs.opencv.org/modules/imgproc/doc/feature_detection.html?highlight=cv2.houghlinesp#cv2.HoughLinesP :

cv2.HoughLinesP(图像, rho, theta, 阈值[ 线[ minLineLength[ maxLineGap]]])

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

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

所以你给的minLineLength参数没有影响(它变成输出变量),并且maxLineGap也有错误的解释。

我建议明确编写参数名称(尚未调整参数)

cv2.HoughLinesP(sk.astype(np.uint8),rho=1,theta=np.pi/180,threshold=100,
                minLineLength=minLineLength,maxLineGap=maxLineGap)

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

可视化线条

我更改了每条线的线条颜色,以便更轻松地可视化哪个线段位于何处:

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

更改参数

通过减少垃圾箱的数量rho and theta(通过增加参数来实现)您将有更多机会让曲线的边缘投票给相同的行箱。

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

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

Too many lines Too many lines shown. Lowering the parameters

为什么要骨骼化?

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

# 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()

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

现在您可以通过执行以下操作单独选择行

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

将霍夫线应用到这些问题上可能有点过分了,但你已经大大分解了你的问题。

指标的计算现在非常简单(请参阅ndimage.测量 http://docs.scipy.org/doc/scipy/reference/ndimage.html#module-scipy.ndimage.measurements文档)并且数组上的迭代非常简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在骨架图像中查找线 OpenCV python 的相关文章

随机推荐

  • 由于 UTFDataFormatException 导致 Spark 中的任务无法序列化:编码字符串太长

    我在 Yarn 上运行 Spark 应用程序时遇到一些问题 我有非常广泛的集成测试 运行时没有任何问题 但是当我在 YARN 上运行应用程序时 它将抛出以下错误 17 01 06 11 22 23 ERROR yarn Applicatio
  • Excel:COUNTIF 函数将“小于”字符视为运算符

    预读说明 我使用的是 LibreOffice 而不是 Excel 但大多数功能应该适用于两者 我正在制作一个电子表格 其中有大量数据 对于每个属性 例如员工数量或姓名 我需要一个函数来计算包含每个不同值的行数 我已经提取了不同的值 现在我使
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • “google cloud run”将 HOME 更改为 CMD 的 /home,其中 RUN 使用 /root

    我正在做的是在 Dockerfile 中的 RUN 命令中设置 sbcl 和 Quicklisp 然后使用 CMD 加载我的自定义代码 当我在本地计算机上使用 Docker 运行它时 一切都很好 但是当我将其推送到 google run 时
  • JOGL 异常 - 在 java.library.path 中找不到gluegen-rt

    线程 main java lang UnsatisfiedLinkError中出现异常 java library path中没有gluegen rt 在 java lang ClassLoader loadLibrary ClassLoad
  • 使用 Play Integrity API 时,Firebase 电话身份验证会出现缺少客户端标识符错误

    使用 Firebase 电话身份验证注册 登录时 身份验证流程始终会启动 reCAPTCHA 流程 并在返回应用程序后发出missing client identifier error 我的设置之前适用于设备验证 安全网络 API 除了我的
  • 使用按钮添加自定义折扣订单总计

    我的模块带有自定义折扣 没问题 配置 xml
  • 如何使用 Javascript 在 html 文件中搜索字符串?

    我有 5 个 html 文件 并且有一个搜索表单 我想用它来搜索这些 html 文件中的文本
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 匹配没有周围字符列表的单词列表

    我有这个正则表达式 one common word or another 除非这两个单词相邻 否则它匹配得很好 One one s more word word common word or another word more anothe
  • 如何在 iOS 6 中强制 UIViewController 为纵向

    As the ShouldAutorotateToInterfaceOrientation在 iOS 6 中已弃用 我用它来强制特定视图仅肖像 在 iOS 6 中执行此操作的正确方法是什么 这仅适用于我的应用程序的一个区域 所有其他视图都可
  • 什么是竞争条件?

    编写多线程应用程序时 最常见的问题之一是竞争条件 我向社区提出的问题是 竞赛条件是什么 你如何检测它们 你如何处理它们 最后 如何防止它们发生 当两个或多个线程可以访问共享数据并且它们试图同时更改它时 就会出现竞争条件 由于线程调度算法可以
  • 为 fill_ Between() 段的不同颜色添加图例

    我正在创建一个 事件图 目前如下所示 但是 我不知道如何为每个颜色组添加图例 这就是目前情节的创建方式 handles dict for i channel events in enumerate channel event list fo
  • Android 中的库可以有自己的意图过滤器吗?

    我想开发一个可以包含在其他 Android 应用程序中的库来拦截某些类型的意图 是否可以 我创建了一个库和一个测试项目 两者都有自己的AndroidManifest xml文件 在库的清单中 我为操作 TEST 定义了一个意图过滤器 但是
  • 哪个视图最亮?

    在Android中 哪个是轻量级视图 例如 View Textview Edittext 等 在某些情况下 我们需要使用视图来填充区域而不向用户显示视图 同时屏幕加载速度应该很快 您可以使用空间 android widget Space S
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • Airflow 1.9 - 无法将日志写入 s3

    我在 aws 的 kubernetes 中运行气流 1 9 我希望将日志发送到 s3 因为气流容器本身的寿命并不长 我已经阅读了描述该过程的各种线程和文档 但我仍然无法让它工作 首先是一个测试 向我证明 s3 配置和权限是有效的 这是在我们
  • TextBlock TextWrapping 不换行 #2

    好吧 那么this https stackoverflow com questions 6625177 textblock textwrapping not wrapping解决方案没有帮助 XAML 在这里
  • 如何在 Hashicorp Terraform 中配置环境变量

    尽管我已经浏览了 Hashicorp 网站上提供的所有教学模块 但我对 Terraform 还很陌生 目前 我正在努力了解如何设置环境变量 我知道如何引用 main tf 配置中的变量 access key var access key 我
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row