MSER+NMS 文本检测(身份证+发票+火车票)

2023-11-13

    此篇文章不细说MSER和NMS原理,以实战为主。

       MSER最大稳定极值区域:是对一幅灰度图像(灰度值为0~255)取阈值进行二值化处理,阈值从0到255依次递增。阈值的递增类似于分水岭算法中的水面的上升,随着水面的上升,有一些较矮的丘陵会被淹没,如果从天空往下看,则大地分为陆地和水域两个部分,这类似于二值图像。在得到的所有二值图像中,图像中的某些连通区域变化很小,甚至没有变化,则该区域就被称为最大稳定极值区域。具体算法的原理参考:Opencv2.4.9源码分析——MSER

       NMS是经常伴随图像区域检测的算法,作用是去除重复的区域,在人脸识别、物体检测等领域都经常使用,全称是非极大值抑制(non maximum suppression),顾名思义就是抑制不是极大值的元素,所以用在这里就是抑制不是最大框的框,也就是去除大框中包含的小框。NMS的基本思想是遍历将所有的框得分排序,选中其中得分最高的框,然后遍历其余框找到和当前最高分的框的重叠面积(IOU)大于一定阈值的框,删除。然后继续这个过程,找另一个得分高的框,再删除IOU大于阈值的框,循环。在这个例子中,就是设定一个IOU阈值(比如0.5,也就是如果两个框的重叠面积大于其中一个框的50%,那么就删除那个框),然后遍历所有框,对剩下的每个框,遍历判断其余框中与他重叠面积大于阈值的,则删除。最后剩下的就是不包含重叠部分的文本框了。具体算法的原理参考:目标检测之非极大值抑制(NMS)各种变体

一,代码:

1.1 MSER.py

import cv2
import matplotlib.pyplot as plt
import numpy as np
import nms

img = cv2.imread('D:/6.jpg')
orig = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

mser = cv2.MSER_create(_min_area=10, _max_area=600)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
regions, boxes = mser.detectRegions(gray)
keep = []
for box in boxes:
    x, y, w, h = box
    keep.append([x, y, x + w, y + h])
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

plt.imshow(img, 'brg')
plt.show()

keep2=np.array(keep)
pick = nms.nms(keep2, 0.3)
for (startX, startY, endX, endY) in pick:
    cv2.rectangle(orig, (startX, startY), (endX, endY), (255, 0, 0), 1)
cv2.imshow("After NMS", orig)
cv2.waitKey(0)

opencv中MSER参数:

注意上面代码中我们是用“cv2.MSER_create()”得到了一个默认的MSER算法对象,这个对象也是可以设置参数的:

  • _delta it compares (sizei−sizei−delta)/sizei−delta
  • _min_area prune the area which smaller than minArea
  • _max_area prune the area which bigger than maxArea
  • _max_variation prune the area have similar size to its children
  • _min_diversity for color image, trace back to cut off mser with diversity less than min_diversity
  • _max_evolution for color image, the evolution steps
  • _area_threshold for color image, the area threshold to cause re-initialize
  • _min_margin for color image, ignore too small margin
  • _edge_blur_size for color image, the aperture size for edge blur

1.2 nms.py 

# import the necessary packages
import numpy as np


# Malisiewicz et al.
def nms(boxes, overlapThresh):
    # if there are no boxes, return an empty list
    if len(boxes) == 0:
        return []

    # if the bounding boxes integers, convert them to floats --
    # this is important since we'll be doing a bunch of divisions
    if boxes.dtype.kind == "i":
        boxes = boxes.astype("float")

    # initialize the list of picked indexes
    pick = []

    # grab the coordinates of the bounding boxes
    x1 = boxes[:, 0]
    y1 = boxes[:, 1]
    x2 = boxes[:, 2]
    y2 = boxes[:, 3]

    # compute the area of the bounding boxes and sort the bounding
    # boxes by the bottom-right y-coordinate of the bounding box
    area = (x2 - x1 + 1) * (y2 - y1 + 1)
    idxs = np.argsort(y2)

    # keep looping while some indexes still remain in the indexes
    # list
    while len(idxs) > 0:
        # grab the last index in the indexes list and add the
        # index value to the list of picked indexes
        last = len(idxs) - 1
        i = idxs[last]
        pick.append(i)

        # find the largest (x, y) coordinates for the start of
        # the bounding box and the smallest (x, y) coordinates
        # for the end of the bounding box
        xx1 = np.maximum(x1[i], x1[idxs[:last]])
        yy1 = np.maximum(y1[i], y1[idxs[:last]])
        xx2 = np.minimum(x2[i], x2[idxs[:last]])
        yy2 = np.minimum(y2[i], y2[idxs[:last]])

        # compute the width and height of the bounding box
        w = np.maximum(0, xx2 - xx1 + 1)
        h = np.maximum(0, yy2 - yy1 + 1)

        # compute the ratio of overlap
        overlap = (w * h) / area[idxs[:last]]

        # delete all indexes from the index list that have
        idxs = np.delete(idxs, np.concatenate(([last],
                                               np.where(overlap > overlapThresh)[0])))

    # return only the bounding boxes that were picked using the
    # integer data type
    return boxes[pick].astype("int")

二,效果:

2.1,发票

 

2.2,火车票

2.3,身份证

 

MSER对图片检测效果不好,在检测身份证的文本信息时,头像区域会有错误,在实际检测时可以先将照片区域遮挡,再进行文本检测。 

 欢迎扫码关注我的微信公众号:

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

MSER+NMS 文本检测(身份证+发票+火车票) 的相关文章

  • 字符识别(OCR算法)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发一个项目 其中我必须开发 OCR 算法 我必须从图像中读取文本 然后将其转换为不同的语言 所以我的第一个任务是从图像中获取文
  • 神经网络特征提取

    我正在使用神经网络进行字母和数字的简单识别 到目前为止 我使用字母图像的每个像素作为网络的输入 不用说 这种方法产生的网络非常大 所以我想从图像中提取特征并将它们用作神经网络的输入 我的第一个问题是字母的哪些属性有利于识别它们 第二个问题是
  • 识别图像中的 visio 形状

    在提供 SCADA 解决方案时 我们经常会获得结构化控制图 如下所示的 visio 类似流程图 中指定的最终用户规范 这些规范通常以 PDF 格式或图像形式提交 为了在 C 中访问这些 我希望使用 OpenCV 库之一 我正在研究模板识别
  • Android OCR 仅使用流行的 tessercat fork tess-two 检测数字

    我正在使用流行的 OCR tessercat fork for android tess twohttps github com rmtheis tess two https github com rmtheis tess two 我整合了
  • OCR 处理前的图像预处理

    我当前的项目涉及将 pdf 中的文本转录为文本文件 我首先尝试将图像文件直接放入 OCR 程序 tesseract 中 但效果不佳 原始图像文件基本上是旧报纸 并且有一些背景噪音 我确信 tesseract 存在问题 因此 我尝试在将图像输
  • Tesseract OCR Android tessdata 目录未找到

    我目前正在使用 OCR 开发 Android 应用程序 并且已经达到了调用 BaseAPI init 方法的程度 我不断收到错误消息 指出该目录必须包含 tessdata 作为子文件夹 我已检查文件目录是否包含其中包含训练数据文件的文件夹
  • 目录:资产/tessdata

    我从 github 下载了 OCR 文本识别器 我的问题是 我想在不在线的情况下启动我的应用程序 但每次我在手机上安装 apk 时 它都会开始下载英语和 tesseract OCR 引擎 我找到了一个在线指南 其中说我必须在资产文件夹中创建
  • Android 中最好的 OCR(光学字符识别)示例 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要一个在android中运行OCR的例子 我做了一些研究并找到了一个在android中实现OCR的例子 https github co
  • 使用Python从具有两列或三列数据的图像中使用OCR读取图像中的文本

    在示例图像中 仅作为参考 我的图像将具有相同的图案 一个页面具有完整的水平文本 其他页面具有两个水平文本列 如何在python中自动检测文档的模式并逐一读取另一列数据 我将 Tesseract OCR 与 Psm 6 一起使用 它是水平读取
  • 使用 Google App Script 从 google 驱动器中进行 OCR 图像

    我已经实现了以下脚本 使用图像 URL 对单个和多个图像进行 OCR function doOCRALL var selected SpreadsheetApp getActiveSheet getActiveRange getValues
  • tesseract 无法识别该图像中的这个单词,这正常吗?

    我需要从这样的小图像中提取单词 我在命令行中使用带有西班牙语选项的 tesseract 如下所示 tesseract category png l spa psm 7 category txt 我认为该文本一定很容易被 OCR 解析 但该单
  • c# OCR无法识别数字(tesseract 2)

    I m trying to extract digits from the following 它失败了 我得到了 作为回报 我正在使用 google 的 tesseract 2 使用 C 开源 c 包装器 现在我想知道 这个图像是否太糟糕
  • 为什么 pytesseract 导致 AttributeError: 'NoneType' 对象没有属性 'bands'?

    我正在尝试开始使用 pytesseract 但正如你在下面看到的 我遇到了问题 我发现人们遇到了似乎相同的错误 他们说这是 PIL 1 1 7 中的错误 其他人说这个问题是由于 PIL 懒惰造成的 需要强制 PIL 加载图像im load
  • 用于屏幕文本的 OCR(光学字符识别)

    我正在尝试创建一个软件 通过捕获屏幕截图来自动化 PC 然后使用 OCR 光学字符识别 来查找要单击的特定按钮 例如 我已经有了鼠标和键盘控制部分 但现在 我需要 OCR 来处理屏幕截图 我发现 Tesseract OCR 似乎不能很好地处
  • 用Python识别图像

    我对 OCR 识别和 Python 都有点陌生 我想要实现的是从 Python 脚本运行 Tesseract 以 识别 tif 中的某些特定数字 我以为我可以为 Tesseract 做一些培训 但我在 Google 和 SO 上没有找到任何
  • 将姓名拆分为名字和姓氏 Java(Android OCR)[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我使用本机 Android JAVA 创建了一个 OCR 光学字符识别 应用程序 我可以将图像转换为文本视图 但是我如何使用这些词分别识别名
  • 在Tomcat中设置环境变量TESSDATA_PREFIX

    我们正在使用名为 Tess4J 的 Tesseract OCR Java 库 如果作为独立应用程序运行 它可以正常工作 它需要一个名为 TESSDATA PREFIX 的变量 其中包含 tessdata 配置和其他字符集相关文件 它也可以与
  • 如何在 Ubuntu/Linux 发行版中安装 Tesseract-OCR 3.03?

    我和一个朋友有兴趣为 CV 项目训练 tesseract OCR 引擎 我们尝试使用一些包装器 例如 PyTesser 和 pyocr 但结果目前不如我们需要的那么准确 因此 我们希望尝试训练超立方体以更好地实现我们的目的 即识别食品标签上
  • 找不到仅适用于数字的 Tesseract 4.0 tessdata

    正如这篇文章中所说 pytesseract 仅使用 tesseract 4 0 数字不起作用 https stackoverflow com questions 46574142 pytesseract using tesseract 4
  • 如何从图像中识别车辆牌照/车牌(ANPR)? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个网站 允许用户上传汽车图像 我想放置一个隐私过滤器来检测车辆上的车牌并对其进行模糊处理 模糊不是问题 但是是否有库或组件 首选

随机推荐

  • Linux练习(显示环境变量)

    include
  • 202. 快乐数 python

    编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果这个过程 结果为 1 那么这个数就是快乐
  • Linux学习笔记——ZooKeeper集群安装部署

    5 8 ZooKeeper集群安装部署 5 8 1 简介 Zookeeper是一个分布式的 开放源码的分布式应用程序协调服务 是Hadoop和HBase的重要组件 它是一个为分布式应用提供一致性服务的软件 提供的功能包括 配置维护 域名服务
  • 剑指offer思路记录(JS)

    目录 常用算法理解 3 数组中重复的数字 4 二维数组中的查找 5 替换空格 6 从尾到头打印链表 7 重建二叉树 9 用两个栈实现队列 10 1 斐波那契数列 10 2 青蛙跳台阶问题 11 旋转数组的最小数字 12 矩阵中的路径 深度优
  • C++刷题--选择题4

    1 在 情况下适宜采用 inline 定义内联函数 A 函数体含有循环语句 B 函数体含有递归语句 C 函数代码少 频繁调用 D 函数代码多 不常调用 解析 C 以inline修饰的函数叫做内联函数 编译时C 编译器会在调用内联函数的地方展
  • 将txt文件的编码格式进行修改

    一 将占用空间比较小的txt文件的GBK编码修改为UTF8的 1 右键使用记事本打开某txt文件 2 点击文件 F 按钮 选择 另存为 A 3 选择保存方式为 UTF 8 点击 保存 over 其他类型转换类似
  • android studio failed to open zip file .Android Studio Error:Connection timed out: connect.

    第一次打开安卓长时间处于下载界面 除了网速太慢 还有可能 有可能 不一定 是gradle配置问题 最近帮同学装android studio 简称AS 时候 第一次打开AS的时候一直停留在加载页面 无法进入 显示一直在下载 想起来了gradl
  • 03.查看 SVN 账号密码

    一 找到svn存放目录 本地存放SVN用户信息的目录为 C Users perke AppData Roaming Subversion auth svn simple 如果找不到直接搜索svn simple 需要时间 二 下载密码查看工具
  • Android架构分析之硬件抽象层(HAL)

    一 分析HAL module 架构 Android硬件抽象层有三个核心数据结构 分别是hw module t hw module methods t hw device t 定义在hardware libhardware include h
  • 大数据——Hadoop3.1.3安装与配置

    大数据 HADOOP 3 1 3安装与配置 1 检查 etc hosts中 ip hostname 映射 20 0 0 1 主机名 ip addr hotname 2 本机免密 cd ssh keygen t rsa cat id rsa
  • python实现随机抽奖游戏

    python实现随机抽奖游戏 import random a 一等奖 0 90 二等奖 90 180 三等奖 180 225 四等奖 225 270 再接再厉 270 360 b random randint 0 360 for x y i
  • 成功实施MES系统的11条建议,收藏备用

    信息化成为社会和企业发展的主流趋势 加上生产力的普遍提高 在这种情势下 MES系统为制造业带来新的生命活力 可以通过信息化方式 实现对整个生产环节智能化 精益化管理 但这一切的前提在于要成功实施MES系统 那么企业如何成功实施MES系统呢
  • 防抖处理(后端处理)

    什么是防抖 在一定时间间隔内函数被触发多次 但只执行最后一次 PS 虽然实际场景中都是前端在处理 但是后端也是需要进行处理的 解决方案思路 通过SpringMvc对请求进行拦截 然后进行重复校验 具体步骤看下面 1 配置自定义的拦截器 防止
  • 异步电机电压型磁链观测器改进-LPF串联HPF+基于时间向量分析的稳态补偿的改进策略

    导读 针对低通滤波环节替换电压模型纯积分环节加反馈补偿的改进方法 磁链估计仍然存在幅值和相位误差 的问题 本期文章介绍采用LPF串联HPF替换纯积分环节 然后基于时间向量分析的稳态补偿策略来对电压模型进行改进 仿真结果表明 新介绍的改进方法
  • 重磅!《深度学习 500 问》已更新,(附完整下载)

    近年来 深度学习技术在计算机视觉 cv 自然语言处理 NLP 等领域都取得了非常不错的成果 自然而然地成为技术人员争相学习的热点 为了帮助正在学习深度学习的伙伴们 川大的一名优秀毕业生 在GitHub上创建了一个项目 深度学习500问 通过
  • C/C++ 递归函数(数组倒序)

    题目描述 输入多个整数 以0结束 将这些整数逆序后输出 要求 使用递归函数将数组倒序 在main中调用递归函数 输入 多个整数 最后为0 输出 逆序后的这些整数 样例输入 1 2 5 4 0 1 2 3 4 5 6 7 8 9 0 样例输出
  • 强大的QDataStream

    书上是这样描述QDataStream的 QDataStream提供了一种与运行平台无关的存储格式 他不仅支持QList
  • JS 之 事件Event对象详解(属性、方法、自定义事件)

    一 Event对象 1 简介 事件event对象是指在浏览器中触发事件时 浏览器会自动创建一个event对象 其中存储了本次事件相关的信息 包括事件类型 事件目标 触发元素等等 浏览器创建完event对象之后 会自动将该对象作为参数传递给绑
  • 详解C语言中的数组指针与指针数组

    详解数组指针与指针数组 数组指针 一 区分 首先我们需要了解什么是数组指针以及什么是指针数组 如下图 int p 5 int p 5 数组指针的意思即为通过指针引用数组 p先和 结合 说明了p是一个指针变量 指向一个大小为5的数组 所以 i
  • MSER+NMS 文本检测(身份证+发票+火车票)

    此篇文章不细说MSER和NMS原理 以实战为主 MSER是最大稳定极值区域 是对一幅灰度图像 灰度值为0 255 取阈值进行二值化处理 阈值从0到255依次递增 阈值的递增类似于分水岭算法中的水面的上升 随着水面的上升 有一些较矮的丘陵会被