改进 HoughLines 以进行水平线检测(Python、OpenCV)

2023-11-29

我有这个源图像:

src

我的目标是删除底线,同时保持字母/数字不变。

这是我使用的代码:

import cv2
import numpy as np

img = cv2.imread('src.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray,100,200,apertureSize = 5)

minLineLength = 0
maxLineGap = 19
lines = cv2.HoughLinesP(edges,1,np.pi/180,15,minLineLength,maxLineGap)
for x in range(0, len(lines)):
    for x1,y1,x2,y2 in lines[x]:
        cv2.line(img,(x1,y1),(x2,y2),(255,255,255),2)

cv2.imshow('hough',img)
cv2.waitKey(0)

我目前取得的最好成绩是这样的:

out

我怎样才能进一步改进它,尽可能地清洁图像? 例如,图像周围的所有碎片、文字下方的点和(静止)线,我该如何去除它们?

谢谢。

OT:有没有办法创建一个跟踪栏来更改参数(apertureSize、minLineLength、maxLineGap 等)以实时查看结果?


根据@Link的要求:

我在 python 方面的经验有限,所以我不知道这段代码的线程安全性如何,但这应该向您展示在 python OpenCV 中创建轨迹栏的基础知识。

def onChange(pos):
    global img
    global gray
    global dst

    dst = np.copy(img)

    apertureSize = cv2.getTrackbarPos("ApertureSize", "Result")
    minLineLength = cv2.getTrackbarPos("LineLength", "Result")
    maxLineGap = cv2.getTrackbarPos("LineGap", "Result")

    # according to OpenCV, aperture size must be odd and between 3 and 7
    if apertureSize % 2 == 0:
        apertureSize += 1
    if apertureSize < 3:
        apertureSize = 3

    edges = cv2.Canny(gray,100,200,apertureSize = apertureSize)

    lines = cv2.HoughLinesP(edges,1,np.pi/180,15,minLineLength,maxLineGap)
    for x in range(0, len(lines)):
        for x1,y1,x2,y2 in lines[x]:
            cv2.line(dst,(x1,y1),(x2,y2),(255,255,255),2)

#Run Main
if __name__ == "__main__" :

    img = cv2.imread("image.png", -1)
    dst = np.copy(img)

    cv2.namedWindow("Result", cv2.WINDOW_NORMAL)

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

    #default values for trackbars
    defaultApertureSize = 5
    minLineLength = 0
    maxLineGap = 19

    # according to OpenCV, aperture size must be odd and between 3 and 7
    # the aperture size range is (0 - 6)
    cv2.createTrackbar("ApertureSize", "Result", defaultApertureSize, 6, onChange)

    # line length range is (0 - 10)
    cv2.createTrackbar("LineLength", "Result", minLineLength, 10, onChange)

    # line gap range is (0 - 19)
    cv2.createTrackbar("LineGap", "Result", maxLineGap, 19, onChange)

    while True:
        cv2.imshow("Result", dst)
        key = cv2.waitKey(1)
        if key == ord('q'):
            break

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

改进 HoughLines 以进行水平线检测(Python、OpenCV) 的相关文章

随机推荐

  • 在新线程中启动异步函数

    我正在尝试创建一个不和谐机器人 我需要在另一个新线程中运行异步函数 因为主线程需要运行另一个函数 不和谐客户端 我正在努力实现的目标 This methods needs to run in another thread async def
  • 如何在iphone中设置html+css添加

    如何在iphone中设置html css添加 webView UIWebView alloc initWithFrame CGRectMake 0 0 320 458 webView delegate self self view addS
  • Notepad++可以将正则表达式匹配的字符串转换为小写吗?

    我有一个 C 源文件 它使用 getMemberName 形式的函数返回成员数据 相反 我想使用memberName 为了匹配需要更改的函数名称的实例 我使用以下正则表达式 s get A Z 问题是 我不知道如何用小写版本替换 2 的实例
  • Firebase ID 令牌在一小时后过期

    所以我正在使用redux saga在我的react native应用程序中并尝试使用刷新令牌但不起作用 所以我的方法是在app js中执行以下操作 以便专门针对每个请求获取令牌并强制刷新它 handleResponse async gt c
  • Django admin查看上传的照片

    我已经在 Django 中实现了照片上传 但在 Django 管理中查看它时遇到问题 模型 py class WorkPlacePhoto models Model file models FileField storage FileSys
  • 如何在 Android 中创建像 Apple Music App 这样的 UI 和控件?

    视频链接 我想创建视图和动画 例如苹果音乐应用程序在 iOS 中可用 但是 我想在 Android 中执行类似于上面的视频链接的操作 是否可以在 Android 中创建这样的视图 我怎样才能实现这个目标 这方面该如何进行呢 请分享任何链接和
  • 浏览器中并发文件下载的最大数量?

    两个相关问题 网页允许打开的最大并发文件数是多少 例如图像 CSS 文件等 我假设这个值在不同的浏览器中是不同的 也许每个文件类型 例如 我非常确定 javascript 文件一次只能加载一个 对吗 有没有办法可以使用javascript来
  • 在 lmer 输出上运行汽车方差分析后出现列表类型错误

    我正在尝试在 R 中做一个随机效应模型 我想运行一个anova在输出中 我浏览了一些教程并复制了他们的示例 但我的不起作用 我在 Anova 上不断收到以下错误 1 length names which term sapply names
  • chrome和firefox之间的window.innerWidth不同?

    html body position absolute width 100 height 100 margin 0 padding 0 overflow hidden The window innerWidth从 FX 和 chrome 返
  • 将 devtools.js 的内容脚本添加到我的新面板

    我花了很长时间试图在我的内容脚本中获取代码来与我的面板对话 此扩展向开发工具添加了一个新面板 从我的内容脚本中 我可以执行以下操作 chrome extension sendMessage greeting hello function r
  • 如何在DatePickerDialog.OnDateSetListener中获取OnClick?

    我正在使用以下方法弹出对话框来选择日期 private DatePickerDialog OnDateSetListener mDateSetListener new DatePickerDialog OnDateSetListener p
  • 将空 XML 元素反序列化为 Guid.Empty

    我在反序列化方面遇到一些麻烦
  • ocaml printf 函数:如果某些条件成立,则完全跳过格式化

    摘自ocaml 在对象的方法中公开 printf 函数 因此可以独立回答 我有以下 简化的 ocaml 代码 用于记录器 type log level Error Warn Info let ord lvl match lvl with E
  • 从namedtuple中获取特定对象的对象名

    我最近发现namedtuple并想用它来替换我讨厌的大类定义 但我很好奇是否有一种聪明的方法来检索我刚刚选择的值的对象名称 如果不清楚 请参阅下面的示例 MyStruct namedtuple MyStruct Var1 Var2 Var3
  • 在 Python 3 中使用 ANSI 序列确定终端光标位置

    我想编写一个小脚本 将图像打印到终端 usr lib w3mimgdisplay 就像在 mac osx 中一样lsi 因此 当脚本启动时 我需要实际的光标位置 或插入符号位置 到目前为止 我想出了用 ANSI 序列获取 shell 中光标
  • 如何使用 Group By 和自连接返回每日最低、最高、开盘价和收盘价结果集?

    SOLVED 堆栈溢出万岁 当我离开时 人们留下了 2 个解决方案 谢谢大家 为两个可行的解决方案分发业力的协议是什么 这是我回来发布的解决方案 它源自另一个 StackOver 解决方案 如何使用聚合函数在MySQL查询中获取分组记录的第
  • 可空对象必须有一个值#2

    我试图重用我一直使用的相同代码 但现在遇到错误 我正在循环访问各种用户表 并在其中执行以下操作 DateTime dcdt DateTime u DateCreated DateTime lldt DateTime u LastLogon
  • 如何使用js移动输入中的文本

    我只是使用 js 来设置文本输入的值 但是 当文本长度超过输入可容纳的长度时 多余的文本将隐藏在输入的右侧部分 如何像正常打字一样隐藏左侧区域多余的文字 原谅我糟糕的英语 当您执行此操作时 您的插入符位置位于文本的开头 您需要将插入符位置移
  • 使用 common lisp 展平列表

    我正在读 Paul Graham 写的 On Lisp 一书 在第 4 章 实用函数 中 他给出了对列表进行操作的小函数的示例 这在编写较大的程序时会很有帮助 其中之一是flatten 给定任意级别的嵌套列表作为参数 展平将删除所有嵌套元素
  • 改进 HoughLines 以进行水平线检测(Python、OpenCV)

    我有这个源图像 我的目标是删除底线 同时保持字母 数字不变 这是我使用的代码 import cv2 import numpy as np img cv2 imread src png gray cv2 cvtColor img cv2 CO