用opencv找到手绘线的端点

2023-11-23

我试图找到手绘线的两个端点 我写了这个找到轮廓的片段, 但终点不正确:

img = cv2.imread("my_img.jpeg")

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Binary Threshold:
_, thr_img = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

cv2.imshow(winname="after threshold", mat=thr_img)
cv2.waitKey(0)

contours, _ = cv2.findContours(image=thr_img, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_SIMPLE)

for idx, cnt in enumerate(contours):
    print("Contour #", idx)
    cv2.drawContours(image=img, contours=[cnt], contourIdx=0, color=(255, 0, 0), thickness=3)
    cv2.circle(img, tuple(cnt[0][0]), 5, (255, 255, 0), 5) # Result in wrong result
    cv2.circle(img, tuple(cnt[-1][0]), 5, (0, 0, 255), 5)  # Result in wrong result
    cv2.imshow(winname="contour" + str(idx), mat=img)
    cv2.waitKey(0)

原图:

enter image description here

我也尝试过cornerHarris但它给了我一些加分

有人可以建议一个准确且更好的方法吗?


我想建议一种更简单、更有效的方法,更重要的是,它不会产生错误的端点:

想法很简单,细化后,计算相邻像素(8-连通性)if neighbours count equals 1 --> the point is an end point

该代码是不言自明的:

def get_end_pnts(pnts, img):
    extremes = []    
    for p in pnts:
        x = p[0]
        y = p[1]
        n = 0        
        n += img[y - 1,x]
        n += img[y - 1,x - 1]
        n += img[y - 1,x + 1]
        n += img[y,x - 1]    
        n += img[y,x + 1]    
        n += img[y + 1,x]    
        n += img[y + 1,x - 1]
        n += img[y + 1,x + 1]
        n /= 255        
        if n == 1:
            extremes.append(p)
    return extremes

main:

img = cv2.imread(p, cv2.IMREAD_GRAYSCALE)
img = cv2.threshold(img, 128, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
img = cv2.ximgproc.thinning(img)
pnts = cv2.findNonZero(img)
pnts = np.squeeze(pnts)
ext = get_end_pnts(pnts, img)
for p in ext:
    cv2.circle(img, (p[0], p[1]), 5, 128)

Output: enter image description here

编辑:您可能有兴趣访问我的答案这个类似的问题。它有一些额外的功能,它还可以检测端点和连接点。

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

用opencv找到手绘线的端点 的相关文章

随机推荐

  • Amazon API Gateway:通过 Postman 调用 API 时,响应正文未转换?

    通过 AWS API Gateway 控制台执行测试时 我发现 Lambda 函数的输出响应已正确转换 type message request id 请参阅下面的日志 Tue Sep 06 14 46 06 UTC 2016 Endpoi
  • 删除R中的冗余列[重复]

    这个问题在这里已经有答案了 我有类似的东西 date pgm in x logs out y 20130514 na 12 j1 12 20131204 z2 03 j1 03 20130516 a01 04 j0 04 20130628
  • 迭代 numpy 数组列的所有成对组合

    我有一个大小为 numpy 的数组 arr size 200 600 20 我想计算scipy stats kendalltau在最后两个维度的每个成对组合上 例如 kendalltau arr 0 0 arr 1 0 kendalltau
  • JSP EL ${stuff} 语法不起作用

    我有两个问题 第一个是我使用JSP 无法解决 第二个是我的行为很奇怪 当我将其放入 servlet 的 doGet 方法中时 req setAttribute test SARASA req getRequestDispatcher WEB
  • df1 中不在 df2 中的所有行

    我有一个 df df1 如下所示 df1 pd DataFrame YYZ SFO 1 YYZ YYD 1 YYZ EWR 1 YYZ DFW 1 YYZ LAX 1 YYZ YYC 1 columns city1 city2 val 我有
  • 你能解释一下Java中的“isXxx”方法名称吗?

    规范之一中是否引用了以 is 开头的方法 而方法名称的后缀是属性名称 类似于 Java bean 的 getter setter 方法 例如 public boolean isConditionTrue private boolean co
  • CRM 365 callManagerInfo 插件中出现错误

    将 CRM 2013 本地升级到 CRM365 后 开始出现插件问题 每次我尝试使用插件中的 IOrganizationService 进行任何操作时 我都会收到错误 此问题仅在多服务器安装时出现 在CRM 2013版本上没有出现这种情况
  • 如何启用“启用.NET Framework 源代码步进”?

    2013 年 2 月 22 日更新 Microsoft Connect 条目有 Alok Shriram 程序经理 基类库 NET Framework 的注释 该问题现在应该得到解决 连接条目标记为已解决 已修复 这个问题现在应该得到解决
  • Android 类 BaseAdapter 中的 getItem 和 getItemId 方法的用途是什么?

    我很好奇这些方法的目的getItem and getItemId在 Android SDK 的 Adapter 类中 从描述来看 似乎getItem应该返回底层数据 所以 如果我有一个名字数组 cat dog red 我创建了一个适配器a使
  • 将数组中的连续数字分组

    我需要将连续数字添加到新数组中 如果不是连续数字 则仅将该值添加到新数组中 old array 1 2 3 5 7 8 9 20 21 23 29 我想得到这个结果 new array 1 2 3 5 7 8 9 20 21 23 29 有
  • 如何在 swift 3.0 中连接多个可选字符串?

    我正在尝试在 swift 3 中连接多个字符串 var a String a var b String b var c String c var d String a b c 编译时我收到以下错误 error cannot convert
  • 如何在 tail -f 命令后继续运行脚本

    我有以下脚本 tail f nohup out echo 5 When I press Ctrl C on tail f the script stops running the 5 is not printed How can I run
  • JScript.NET 可以用于编写 .NET 应用程序脚本吗?

    自从多发性硬化症似乎已在最新的 DLR 中终止了托管 JavaScript对于服务器端 ASP NET Futures 和客户端 Silverlight 是否有人成功使用未过时的 API 来允许使用 JScript NET 编写其应用程序对
  • Javamail API - 如何将 setFrom 更改为您想要的任何内容?

    如何将 setFrom 方法更改为我想要的方法 我可以通过我的 gmail 帐户发送电子邮件并更改 setFrom 文本 但它显示了我的username对于电子邮件 我也尝试使用我的雅虎帐户 但收到身份验证错误 我想更改发件人地址 代码如下
  • 如何绑定到 CaretIndex 又名文本框的光标位置

    嗨 我正在尝试绑定到TextBox CaretIndex属性不是DependencyProperty 所以我创建了一个Behavior 但它没有按预期工作 期望 集中注意力时 默认 0 如果我改变我的值view它应该改变我的值视图模型 如果
  • 以第一个元素作为主元的快速排序示例

    我目前正在研究快速排序 想知道当第一个 或最后一个 元素被选为枢轴点时它是如何工作的 比如说我有以下数组 15 19 34 41 27 13 9 11 44 这就是我认为发生的情况 15 19 34 41 27 13 9 11 44 piv
  • InvalidOperationException:堆栈为空

    我的应用程序工作正常 但突然停止工作并给出以下错误 InvalidOperationException Stack empty System ThrowHelper ThrowInvalidOperationException Except
  • 使用 phantomjs 的 cntlm 代理

    我正在尝试在 Windows 计算机上使用 cntlm 代理来与 IIS 上使用 PhantomJS 的 Windows 身份验证的本地 Web 应用程序进行通信 要创建代理 我正在执行以下操作 cntlm v u username dom
  • django-为什么重定向后,表单显示“无”

    我有一个表单 输入信息后 根据信息过滤数据库并进行一些计算 最后将结果显示到重定向的网址 我确实可以重定向到另一个网址并成功显示结果 但问题在于它无法显示用户提交的任何数据 只是对每个字段不显示任何内容 并且结果不是基于过滤后的查询集 比如
  • 用opencv找到手绘线的端点

    我试图找到手绘线的两个端点 我写了这个找到轮廓的片段 但终点不正确 img cv2 imread my img jpeg img gray cv2 cvtColor img cv2 COLOR BGR2GRAY Binary Thresho