MSER+NMS 文本检测(身份证+发票+火车票)
版权
此篇文章不细说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 nmsimg = 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 = boxkeep.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 listif len(boxes) == 0:return []# if the bounding boxes integers, convert them to floats --# this is important since we'll be doing a bunch of divisionsif boxes.dtype.kind == "i":boxes = boxes.astype("float")# initialize the list of picked indexespick = []# grab the coordinates of the bounding boxesx1 = 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 boxarea = (x2 - x1 + 1) * (y2 - y1 + 1)idxs = np.argsort(y2)# keep looping while some indexes still remain in the indexes# listwhile len(idxs) > 0:# grab the last index in the indexes list and add the# index value to the list of picked indexeslast = len(idxs) - 1i = 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 boxxx1 = 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 boxw = np.maximum(0, xx2 - xx1 + 1)h = np.maximum(0, yy2 - yy1 + 1)# compute the ratio of overlapoverlap = (w * h) / area[idxs[:last]]# delete all indexes from the index list that haveidxs = np.delete(idxs, np.concatenate(([last],np.where(overlap > overlapThresh)[0])))# return only the bounding boxes that were picked using the# integer data typereturn boxes[pick].astype("int")
二,效果:
2.1,发票
2.2,火车票
2.3,身份证
MSER对图片检测效果不好,在检测身份证的文本信息时,头像区域会有错误,在实际检测时可以先将照片区域遮挡,再进行文本检测。
MSER+NMS 文本检测(身份证+发票+火车票)相关推荐
- OpenCV—python OCR文本检测
文章目录 一.形态学文本区域检测 1.1 直接匹配 1.2 多尺度匹配 二.MSER+NMS文本区域检测 2.1 MSER 2.2 NMS 一.形态学文本区域检测 图像形态学操作,包括膨胀.腐蚀基本操 ...
- 通用卡证信息高精度识别流程 OCR 文本检测 文本识别 身份证 银行卡
目录 如何将一张身份证图像的信息识别出来? 身份证识别点我 银行卡识别点我 第一步 目标检测 第二步 图像校正 如何获取匹配点对坐标 求解透视变换矩阵 第三步 文本检测 CTPN 第四步 文本识别 C ...
- MSER — 自然场景文本检测
MSER是最大稳定极值区域:是对一幅灰度图像(灰度值为0-255)取阈值进行二值化处理,阈值从0到255依次递增.阈值的递增类似于分水岭算法中的水面的上升,随着水面的上升,有一些较矮的丘陵会被淹没,如 ...
- 目标检测模型中NMS、soft-NMS、softer-NMS的原理、LNMS文本检测系列(python代码实现)
非极大值抑制NMS的作用: 是目标检测框架中的后处理模块,主要用于删除高度冗余的bbox. ?一.NMS[参考] 非极大值抑制NMS的过程: 根据置信度得分进行排序: 选择置信度最高的边界框添加到最终 ...
- 基于PaddleOCR的DBNet多分类文本检测网络之身份证识别
目的 全网的身份证识别大部分都是通过识别整张图片,然后再对数据进行格式化解析,这会照成很大的局限性,比如非摆正图片,图片上有其他干扰信息,这就会导致通过此方式来识别大大降低了准确率和不确定性.这篇文章 ...
- 车牌定位之MSER — 文本检测
最大稳定极值区域(MSER-Maximally Stable Extremal Regions)可以用于图像的斑点区域检测.它是基于分水岭的概念. SIFT和SURF算法高效实现了具有尺度和旋转不变性 ...
- 基于EAST和Tesseract的文本检测与识别
目录 导言 现实世界问题 说明 问题陈述 业务目标和约束条件 可用于文本检测和识别的数据集 数据集概述和说明 探索性数据分析(EDA) 深度学习时代之前的文本检测方法 EAST(高效精确的场景文本检测 ...
- 文本检测与识别技术的应用现状及产业案例
文本检测与识别技术的产业应用现状 文本是人类文明的视觉和物理载体,文本的检测和识别使视觉与对其内容的理解进一步联系起来.在这一部分中,我们列出并分析了对提高我们的生产力和生活质量产生或将产生重大影响的 ...
- 人工智能学习--文本检测实践
注释:文本检测 和 文本识别是两回事. 可能现在已经有 end-to-end的深度神经网络可以将文本检测和识别一起实现,这个要去搜相关的sci论文. 文本检测,是从一张图片中找到文字区域,并用矩形框标 ...
最新文章
- 学习全基因组测序数据分析1:测序技术
- 算法(6) —— AVL树
- (5.1.5)引擎管理——多服务器管理之中央管理服务器(CMS)
- 三星GT-I9308 Galaxy SIII 移动定制机 root方法 (亲测可用)
- Linux学习之系统编程篇:进程回收(wait / waitpid)
- SpringMVC 快速入门
- python 类和对象 有必要学吗_Python学习——对类和对象的初步理解,初识,与
- 【java笔记】继承
- python fortran混编 ctypes_Python调用C/Fortran混合的动态链接库--上篇
- 《Web前端工程师修炼之道(原书第4版)》——移动Web
- Word2Vec模型详解
- 请用html5标准完成以下页面布局(要求完整书写整个页面的html代码,不需要写CSS)
- 闲时整理3--Android调用指纹验证
- Problem 1 : Multiples of 3 and 5
- 编写类的步骤编写测试类
- MySQL高级查询语句——超详细,一篇就够了
- python png 背景透明_Python - 移除PNG透明图的alpha通道
- WebService(腾讯QQ在线状态 WEB 服务)
- python能开发小程序吗_搭建小程序用Python语言可以搭建吗?
- 赛扬处理器_英特尔释放诚意:入门赛扬处理器升级不加价