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

article/2025/9/13 1:36:11

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


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


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

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

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

Q i Q_i Qi表示阈值为 i 时的某一连通区域,则变化率 q i q_i qi 为:

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

当变化率 q i q_i qi 为局部极小值时,则 Q i Q_i Qi为最大稳定极值区域。


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://chatgpt.dhexx.cn/article/vo8xfh8k.shtml

相关文章

师傅带徒弟学JavaScript-关东升-专题视频课程

师傅带徒弟学JavaScript—430人已学习 课程介绍 本课程是学习Web前端的基础课程,是学习Web前端框架、JavaWeb开发、Python Web开发、PHP开发和.NET Web开发前置课程。 课程收益 掌握JavaScript 讲师介绍 关东升 更多讲师课程 一个在IT领域摸爬滚打20多年的老程…

师傅带徒弟学:Python Web之Flask框架-关东升-专题视频课程

师傅带徒弟学:Python Web之Flask框架—317人已学习 课程介绍 Python Web是Python语言一个重要的应用方面,Python Web有很多,其中Flask和Django框架是他们的佼佼者。 Flask是一个Python实现的Web开发微框架。 课程收益 掌握Flask框架 讲师…

关东升的iOS实战系列图书 《iOS实战:入门与提高卷(Swift版)》已经上市

 承蒙广大读者的厚爱我的 《iOS实战:入门与提高卷(Swift版)》京东上市了,欢迎广大读者提出宝贵意见。http://item.jd.com/11766718.html 欢迎关注关东升新浪微博tony_关东升。 关注智捷课堂微信公共平台&…

Sharding-JDBC(一)SpringBoot集成

目录 1.背景2.简介3.依赖与配置4.表结构(1..3)5.测试验证5.1 批量保存5.2 列表查询 6.源码地址 1.背景 随着业务数据量的增加,原来所有的数据都是在一个数据库上,网络IO及文件IO都集中在一个数据库上,因此CPU、内存、…

第一篇【Python】基础-关东升-专题视频课程

第一篇【Python】基础—833人已学习 课程介绍 本书是智捷课堂开发的立体化图书中的一本,所谓“立体化图书”就是图书包含:书籍、视频、课件和服务等内容。 其中第一篇包括8章内容,系统介绍了Python语言的基础知识。内容包括Python语言历史…

shardingsphere-jdbc 整合 springboot

shardingsphere官网地址 https://shardingsphere.apache.org/document/5.2.0/cn/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/sharding/ 当前我们演示的是水平分表 1、基础环境配置以及依赖管理 1.1 创建数据库表结构 CREATE TABLE address_0 (id bigint(…

如果张东升是个程序员

张东升是一家互联网公司的程序员,一直以来都勤勤恳恳老实工作。 可最近一段时间,行业不景气,老板不但下令开启了996的工作模式,更要命的是频频更改需求,弄得大家是敢怒不敢言。 时间一久,很多员工开始消极…

专访关东升:松耦合分层架构设计

关东升,国内知名iOS技术作家,iOS技术顾问,高级培训讲师,移动开发专家。拥有16年软件开发经验、8年培训行业经验。精通iOS、Android和 Windows Phone 7及Html5等移动开发技术。在App Store发布多款游戏和应用软件,擅长移动平台的应用和游戏类项目开发。目前主要从事iOS应用…

Java从小白到大牛第3篇 【进阶篇】-关东升-专题视频课程

Java从小白到大牛第3篇 【进阶篇】—4371人已学习 课程介绍 本视频是智捷课堂推出的一套“Java语言学习立体教程”的视频第三部分,读者以及观看群是初级小白,通过本视频的学习能够成为Java大牛。本主要内容包括:异常处理、集合、泛型、文…

Python项目实战:数据可视化与股票数据分析-关东升-专题视频课程

Python项目实战:数据可视化与股票数据分析—333人已学习 课程介绍 本视频内容包括使用Matplotlib绘制图表、MySQL数据库、Python访问数据库和Lambda表达式。 目录: 23.1 使用Matplotlib绘制图表 23.1.1 安装Matplotlib 23.1.2 图表基本构成要素 23.1…

【ShardingSphere技术专题】「ShardingJDBC实战阶段」SpringBoot之整合ShardingJDBC实现分库分表(JavaConfig方式)

前提介绍 ShardingSphere介绍 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据…

关东升给的ios学习路线图(可以借鉴)

来源: http://www.zhijieketang.com/classroom/3/introduction 首页 课程 免费课程 会员 关于我们 登录 注册 首页 iOS课程 iOS会员-iOS开发学习路线图 iOS会员-iOS开发学习路线图 扫二维码继续学习 (0评价) 价格: 1500 金币 学员(17) 课程(37) …

关东升的《从零开始学Swift》3月9日已经上架

大家一直期盼的《从零开始学Swift》于3月9日已经上架,它是关东升老师历时8个月的呕心沥血所编著,全书600多页,此本书基于Swift 2.x,通过大量案例全面介绍苹果平台的应用开发。全书共分5 部分,包括Swift语法篇、Cocoa T…

python从小白到大牛百度云盘_Java从小白到大牛 (关东升著) 中文pdf+mobi版[36MB]

《Java从小白到大牛》是一本Java语言学习立体教程,读者群是零基础小白,通过本书的学习能够成为Java大牛。主要内容包括:Java语法基础、Java编码规范、数据类型、运算符、控制语句、数组、字符串、面向对象基础、继承与多态、抽象类与接口、枚…

SpringBoot 整合 Sharding-JDBC

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、sharding-jdbc简介二、使用步骤 1.新建项目、引入依赖2.代码实战总结 前言 SpringBoot 整合 Sharding-JDBC 提示:以下是本篇文章正文内容&…

关东升的iOS实战系列图书 《iOS实战:传感器卷(Swift版)》已经上市

 承蒙广大读者的厚爱我的 《iOS实战:传感器卷(Swift版)》京东上市了,欢迎广大读者提出宝贵意见。http://item.jd.com/11760248.html 欢迎关注关东升新浪微博tony_关东升。 关注智捷课堂微信公共平台&…

Java从小白到大牛第1篇 Java基础-关东升-专题视频课程

Java从小白到大牛第1篇 Java基础—3042人已学习 课程介绍 本视频是智捷课堂推出的一套“Java语言学习立体教程”的视频第一部分,读者以及观看群是初级小白,通过本视频的学习能够成为Java大牛。本主要内容包括:Java语法基础、Java编码规范…

Sharding-JDBC 基础

Sharding-JDBC 是当当网开源的适用于微服务的分布式数据访问基础类库,完整的实现了分库分表,读写分离和分布式主键功能,并初步实现了柔性事务。 从 2016 年开源至今,在经历了整体架构的数次精炼以及稳定性打磨后,如今…

python从小白到大牛pdf 下载 资源共享_Kotlin从小白到大牛 (关东升著) 中文pdf高清版[12MB]...

本书是一本Kotlin语言学习立体教程,主要内容包括:Kotlin语法基础、Kotlin编码规范、数据类型、字符串、运算符、程序流程控制、函数、面向对象基础、继承与多态、抽象类与接口、高阶函数、Lambda表达式、数组、集合、函数式编程API、异常处理、线程、协程…

Java从小白到大牛第4篇项目实战1——PetStore宠物商店-关东升-专题视频课程

Java从小白到大牛第4篇项目实战1——PetStore宠物商店—1764人已学习 课程介绍 PetStore是Sun(现在Oracle)公司为了演示自己的Java EE技术,而编写的一个基于Web宠物店项目。PetStore是典型的电子商务项目,是现在很多电商平台的…