【OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域(MSER)

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程 300篇】247. 特征检测之最大稳定极值区域(MSER)


1. 最大稳定极值区域(MSER)

最大稳定极值区域(MSER-Maximally Stable Extremal Regions),是一种检测图像文本区域的算法,基于分水岭的思想对图像进行斑点区域检测。
MSER算法具有仿射不变性,对灰度的变化具有较强的鲁棒性,但检测准确率低于深度学习方法,主要用于自然场景的文本检测的前期阶段。

MSER算法对灰度图像进行阈值处理,阈值从0到255依次递增,类似于分水岭算法中的水平面的上升。最低点首先被淹没,随着水面的上升逐渐淹没整个山谷,直到所有的点全部被淹没。在不同阈值下,如果某些连通区域不变或变化很小,则该区域称为最大稳定极值区域。

QiQ_iQi表示阈值为 i 时的某一连通区域,则变化率 qiq_iqi 为:

qi=∣Qi+Δ−Qi∣∣Qi∣q_i= \frac{|Q_{i+\Delta} - Q_i|}{|Q_i|}qi=QiQi+ΔQi

当变化率 qiq_iqi 为局部极小值时,则 QiQ_iQi为最大稳定极值区域。


2. OpenCV 的 cv::MSER类

OpenCV中提供了MSER类,MSER类继承了cv::Feature2D类。

在Python语言中,OpenCV提供了MSER类的接口函数cv.MSER.create实例化MSER类,成员函数detectRegions检测并返回找到的所有区域。

函数原型:

cv.MSER.create([, delta, min_area, max_area, max_variation, min_diversity, max_evolution, area_threshold, min_margin=, edge_blur_size]) → retval

cv.MSER_create([, delta, min_area, max_area, max_variation, min_diversity, max_evolution, area_threshold, min_margin=, edge_blur_size]) → retval

mser.detectRegions(image[, ]) → msers, bboxes

参数说明:

● image:输入图像,8位单通道、3通道或4通道图像
● msers:检测到的所有区域的点集,列表格式
● bboxes:检测到的所有区域的边界矩形,列表格式
● delta:灰度值的变化量,变化率公式中的Δ\DeltaΔ,默认值5
● min_area:区域最小面积阈值,默认值60
● max_area:区域最大面积阈值,默认值14400
● max_variation:最大变化率,默认值0.25

注意问题:

⒈函数cv.MSER.create或cv.MSER_create实例化MSER类,创建一个MSER对象mser。在OpenCV的不同版本中可能只允许其中一种方式。
⒉OpenCV的部分版本中,参数delta、min_area、max_area、max_variation的格式为 _delta、_min_area、_max_area、_max_variation。
⒊成员函数detectRegions检测并返回找到的所有区域,输出参数msers、bboxes都是列表格式,列表长度为N,对应于找到的N个区域。
⒋列表msers的第i个元素msers[i]是形如(k,2)的Numpy数组,表示第i个区域点集,k是第i个区域的像素点数量。msers[i]的每一行msers [i][k,:]表示第i个区域的第k个像素点的坐标[x,y]。
⒌列表bboxes的第i个元素bboxes[i]是形如(4,)的Numpy数组,表示第i个区域的垂直边界矩形。数组元素[x, y, w, h]分别表示左上角顶点坐标 (x,y)、矩形宽度w和高度h。


3. 例程14.29:特征检测之最大稳定极值区域(MSER)

本例程示例MSER检测最大稳定极值区域,并通过NMS删除重复结果。MSER检测到4082个区域,NMS删除重复结果后减少到了149个区域。

# 14.29 特征检测之最大稳定极值区域(MSER)
import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltdef NonMaxSuppression(boxes, thresh=0.5):x1, y1 = boxes[:,0], boxes[:,1]x2, y2 = boxes[:,0]+boxes[:,2], boxes[:,1]+boxes[:,3]area = boxes[:,2] * boxes[:,3]  # 计算面积# 删除重复的矩形框pick = []idxs = np.argsort(y2)  # 返回的是右下角坐标从小到大的索引值while len(idxs) > 0:        last = len(idxs) - 1  # 将最右下方的框放入pick 数组i = idxs[last]pick.append(i)# 剩下框中最大的坐标(x1Max,y1Max)和最小的坐标(x2Min,y2Min)x1Max = np.maximum(x1[i], x1[idxs[:last]])y1Max = np.maximum(y1[i], y1[idxs[:last]])x2Min = np.minimum(x2[i], x2[idxs[:last]])y2Min = np.minimum(y2[i], y2[idxs[:last]])# 重叠面积的占比w = np.maximum(0, x2Min-x1Max+1)h = np.maximum(0, y2Min-y1Max+1)overlap = (w * h) / area[idxs[:last]]# 根据重叠占比的阈值删除重复的矩形框idxs = np.delete(idxs, np.concatenate(([last], np.where(overlap > thresh)[0])))return boxes[pick]  # x, y, w, hif __name__ == '__main__':img = cv.imread("../images/Fig0944a.tif", flags=1)gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)height, width = gray.shape[:2]# 创建 MSER 对象,检测 MSER 区域# mser = cv.MSER_create(_min_area=500, _max_area=20000)mser = cv.MSER.create(_min_area=306, _max_area=20000)  # 实例化 MSERregions, boxes = mser.detectRegions(gray)  # 检测并返回找到的 MSERlenMSER = len(regions)  # 4082print("Number of detected MSER: ", lenMSER)# print(regions[0].shape, boxes[0].shape)imgMser1 = img.copy()imgMser2 = img.copy()for i in range(lenMSER):# 绘制 MSER 凸壳points = regions[i].reshape(-1, 1, 2)  # (k,2) -> (k,1,2)hulls = cv.convexHull(points)cv.polylines(imgMser1, [hulls], 1, (255,0,0), 2)  # 绘制凸壳 (x,y)# 绘制 MSER 矩形框x, y, w, h = boxes[i]  # 区域的垂直矩形边界框cv.rectangle(imgMser2, (x,y), (x+w,y+h), (0,0,255), 2)# 非最大值抑制 (NMS)imgMser3 = img.copy()nmsBoxes = NonMaxSuppression(boxes, 0.6)lenNMS = len(nmsBoxes)  # 149print("Number of NMS-MSER: ", lenNMS)for i in range(lenNMS):# 绘制 NMS-MSER 矩形框x, y, w, h = nmsBoxes[i]  # NMS 矩形框cv.rectangle(imgMser3, (x,y), (x+w,y+h), (0,255,0), 2)plt.figure(figsize=(9, 6))plt.subplot(131), plt.title("MSER regions")plt.axis('off'), plt.imshow(cv.cvtColor(imgMser1, cv.COLOR_BGR2RGB))plt.subplot(132), plt.title("MSER boxes")plt.axis('off'), plt.imshow(cv.cvtColor(imgMser2, cv.COLOR_BGR2RGB))plt.subplot(133), plt.title("NMS-MSER boxes")plt.axis('off'), plt.imshow(cv.cvtColor(imgMser3, cv.COLOR_BGR2RGB))plt.tight_layout()plt.show()

运行结果:

Number of detected MSER: 4082
Number of NMS-MSER: 149

在这里插入图片描述

程序说明
程序运行结果如图17-9所示。
⑴ 子图1绘制MSER算法检测到的最大稳定极值区域,检测结果取决于区域面积的阈值设置。子图2绘制检测到的MSER区域的垂直边界矩形。
⑵ 子图3通过NMS方法删除了检测到的MSER区域中的重复结果。MSER算法检测到4082个区域,NMS去重后减少为 149 个区域。


4. 非极大值抑制 NMS

非极大值抑制(non maximum suppression, nms)是通常用于目标检测算法,作用是去除重复的区域,就是抑制不是极大值的元素,在这里就是去除和想要的框重叠部分过大的框。

NMS的基本思想是将所有框按得分进行排序,然后无条件保留其中得分最高的框,然后遍历其余框找到和当前最高分的框的重叠面积(IOU)大于一定阈值的框,并删除。然后继续这个过程,找另一个得分高的框,再删除和其IOU大于阈值的框,一直循环直到所有的框都被处理。

在目标检测中,常用非极大值抑制算法(NMS)对生成的大量候选框进行后处理,在 faster R-CNN 中,每一个 bbox 都有一个得分,然后使用 NMS 去除冗余的候选框,得到最具代表性的 bbox,以加快目标检测的效率。

NMS的具体实现流程为:

  • 根据候选框的类别分类概率(得分),按最高到最低将BBox排序,例如:A>B>C>D>E>F
  • 先标记最大概率矩形框A是要保留下来的,即A的分数最高,则无条件保留
  • 将B~E分别与A求重叠率IoU(两框的交并比),假设B、D与A的IoU大于设定的阈值,那么B和D可以认为是重复标记被剔除
  • 继续从剩下的矩形框C、E、F中选择概率最大的C,标记为要无条件保留下来的框,然后分别计算C与E、F的重叠度,扔掉重叠度超过设定阈值的矩形框
  • 就这样一直重复下去,直到剩下的矩形框没有了,得到所有要保留下来的矩形框

【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125724395)
Copyright 2022 youcans, XUPT
Crated:2022-11-28

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑蹦迪

如何建立一个小程序让你的电脑蹦迪的呢? 效果演示 1.首先在桌面新建一个记事本 2.在里面添加如下代码 color 1A echo 电脑color 1B echo 电脑color 1C echo 电脑color 1D echo 电脑echo %0 3.保存记事本文件 4.修改后对名为.bat之后点击运行即可。

MATLAB教程(1) MATLAB 基础知识(2)

第三部分:数组的索引 数组索引- MATLAB & Simulink- MathWorks 中国 MATLAB中的每一个变量都是可以存储多个值的数组。如果想要使用数组中的某一个值,则需要用到索引。 1.单个元素的索引 从一个数组中索引某个元素一般有两种方法: 第…

没有bug队——加贝——Python 练习实例 7,8

7.题目: 将一个列表的数据复制到另一个列表中。 程序分析:使用列表[:]。 注:[:] 表示索引全部;[1:]表示从索引1到最后;[:2]表示从第一个索引到索引2前一个 a [1, 2, 3] b1 a[:] b2 a[1:] b3 a[:2] print (b1) …

云动画文字

用Js技术实现云动画文字。 效果演示 代码展示 html内容 <!doctype html> <html><head><meta charset"utf-8"><title></title><style>body {background-color:#000000;color:#555555; } h4 {font-family:sans-serif;co…

爬虫之祖urlib 简易教程

目录 一、前言框架 二、网址请求 2.1 打开网址 2.2 超时设置 2.3 错误抓取 三、更深请求 3.1 打开网址 3.2 请求头添加 3.3 链接解析 四、Robots 协议 五.万能视频下载 小彩蛋 一、前言框架 我们来学一下爬虫之祖urlib&#xff0c;不管你什么模块都是起源于该模块。…

【youcans 的 OpenCV 学习课】12. 彩色图像的处理

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】12.彩色图像的处理 文章目录【youcans 的 OpenCV 学习课】12.彩色图像的处理1. 图像的颜色空间转换图像的色彩空间基础图像的颜色空…

炫酷线条背景动画

使用H5的Canvas实现网页的炫酷线条背景特效。 效果演示 代码展示 html内容 <!DOCTYPE html> <html > <head> <meta charset"UTF-8"> <title></title><style> canvas{position:absolute;top:0;left:0;background-colo…

MATLAB教程(1) MATLAB 基础知识(3)

第五部分&#xff1a;文本和字符 文本和字符- MATLAB & Simulink- MathWorks 中国 在处理文本时&#xff0c;将其中的字符序列用单引号括起来&#xff0c;可以将文本分配给变量。 例如&#xff1a;myText Hello, world如果文本本身包括一个单引号&#xff0c;则在定义时…

没有bug队——加贝——Python 练习实例 9,10

9.题目&#xff1a; 暂停一秒输出。 程序分析&#xff1a;使用 time 模块的 sleep() 函数。 注&#xff1a;dict.items表示取出字典中的值 代码&#xff1a; #9 import timemyD {1: a, 2: b} for key, value in dict.items(myD):print (key, value)time.sleep(1) # 暂停 …

Spring Boot Data JPA

Spring Data JPA简介 用来简化创建 JPA 数据访问层和跨存储的持久层功能。 Spring Data JPA提供的接口 Repository&#xff1a;最顶层的接口&#xff0c;是一个空的接口&#xff0c;目的是为了统一所有Repository的类型&#xff0c;且能让组件扫描的时候自动识别。 CrudRep…

MATLAB教程(1) MATLAB 基础知识(4)

第七部分&#xff1a;二、三维图 二维图和三维图- MATLAB & Simulink- MathWorks 中国 折线图 &#xff08;1&#xff09; 画图 x 0:pi/1000:2*pi; y sin(x); plot(x,y) 这里x就用到了前面说到的索引。x表示0到2*pi之间步长为pi/100的值。 二维图如下&#xff1a; 这里…

现在能不能升级鸿蒙,能不能升级鸿蒙系统?

电梯直达huafen185613402初窥门径发表于 2021-2-28 14:28:33来自&#xff1a;华为Mate 10 Pro最新回复 2021-2-28 17:34:28这个手机现在性能还非常好呀&#xff0c;期待能够给予鸿蒙系统升级产品型号BLA-AL00出现频率总是问题类型其他应用名称Android 系统应用版本10系统版本BL…

Spring Boot MyBatis

MyBatis简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache 迁移到了google code&#xff0c;并且改名为MyBatis 。 集成spring boot 的时候必须在mapper接口上面标注Mapper注解 项目图片 pom.xml 只需要在pom.xml引入需要的数据库配置&#xff0c;就会…

没有bug队——加贝——Python 练习实例 11,12

11.题目&#xff1a; 古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 程序分析&#xff1a;兔子的规律为…

Spring Boot JDBC

JDBC详解 Java Data Base Connectivity,是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。不管是Hibernate&#xff0c;还是JPA或者MyBatis都是对JDBC做了一次封装。 Spring简化了JDBC那些内…

没有bug队——加贝——Python 练习实例 13,14

今天水一天&#xff0c;看了看这两道题&#xff0c;感觉没啥好注意的了&#xff0c;或许是我归被窝的心似箭吧&#xff0c;哈哈哈哈&#xff0c;如果我想起了有补充的&#xff0c;我再出被窝。。。 13.题目&#xff1a; 打印出所有的"水仙花数"&#xff0c;所谓&qu…

Spring Boot 热部署 devtools模块

devtools模块详解 devtools模块&#xff0c;是为开发者服务的一个模块。主要的功能就是代码修改后一般在5秒之内就会自动重新加载至服务器&#xff0c;相当于restart成功。 简单原理 在发现代码有更改之后&#xff0c;自动重新启动应用&#xff0c;但是其速度比手动停止后再…

零基础入门Matlab(补充)

目录 1.界面认识 2.变量命名 3.数据类型 4.元胞数组和结构体 5.矩阵操作 6.程序结构 7.基本绘图操作 7.1.二维平面绘图 7.2.三维立体绘图 8.图形的保存与导出 9.补充 1.界面认识 2.变量命名 注&#xff1a;Matlab中的注释 %% 独占一行的注释&#xff08;有上下横线…

html5中隐藏段落,html怎么隐藏p标签

html隐藏p标签的方法&#xff1a;1、给p标签添加hidden属性&#xff0c;语法“”&#xff1b;2、在p标签中使用style属性&#xff0c;添加“display: none”或“visibility: hidden”样式。”&#xff1b;2、在p标签中使用style属性&#xff0c;添加“display: none”或“visib…

Dev C++详细安装教程

Dev-C是一个Windows环境下的一个适合于初学者使用的轻量级 C/C 集成开发环境&#xff08;IDE&#xff09;。它是一款自由软件&#xff0c;遵守GPL许可协议分发源代码。它集合了MinGW中的GCC编译器、GDB调试器和 AStyle格式整理器等众多自由软件。 Dev C 5.11 简体中文版下载地…