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

news2024/11/27 2:39:37

『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 plt

def 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, h

if __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)  # 实例化 MSER
    regions, boxes = mser.detectRegions(gray)  # 检测并返回找到的 MSER
    lenMSER = len(regions)  # 4082
    print("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)  # 149
    print("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.coloradmin.cn/o/51821.html

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

相关文章

RNN/LSTM (三) 学习torchtext源码

文章目录包装dataset构建词库1.列举数据源2. 遍历数据3. 列举特殊符号4. 构建词库 Field::vocab_clsload_vectors构建读指针 data.BucketIterator在上一文,我们学习了基于torchtext编写lstm模型的实践案例,本文将结合上文案例,深入案例代码&a…

Python自动化之Excel利器openpyxl

文章目录前言一、Workbook1.1 读取xlsx文件1.2 保存二、Sheet2.1 创建Sheet2.2 遍历Sheet2.3 移动Sheet2.4 删除Sheet2.5 插入、删除行列三、单元格3.1 获取某个单元格3.2 遍历单元格3.3 获取范围单元格3.4 单元格赋值3.5 合并/解除合并单元格3.6 单元格数据格式3.7 单元格数字…

[附源码]Python计算机毕业设计Django儿童早教课程管理系统论文2022

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

算法设计与分析 SCAU19180 集合划分问题

19180 集合划分问题 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 教材课后习题2-8 n个元素的集合{1,2,…,n}可以划分若干个非空子集。例如,当n4时,集合{1,2,3,4}可以划分为15个不同的非…

微信小程序开发学习文档(万字总结,一篇搞定前端开发)

一、微信小程序简介 与网页开发不同,小程序有自己的一套标准开发模式:-申请小程序开发账号-安装小程序开发工具-创建和配置小程序项目 1.1 创建第一个小程序 1.2 主界面的5个组成部分 1.3小程序项目的基本构成 pages 用来存放所有小程序的页面&#xf…

Java并发编程—Thread类中的start()方法如何启动一个线程【原理分析】?

一、java线程的介绍: 在java的开发过程中,很多铁子对于java线程肯定不感到陌生,作为java里面重要的组成部分,这里就从如何创建一个线程给大家进行分析; 二、相关知识引入: ​ 之前我了解过,j…

2022年浙江省中职组“网络空间安全”赛项模块B--Windows渗透测试

2022年中职组浙江省“网络空间安全”赛项 B-1:Windows渗透测试一、竞赛时间 420分钟 共计7小时 吃饭一小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第①阶段: 单兵模式系统渗透测试 任务一: Windows操作系统渗透测试 任务二: Linux操作系统渗透测试 任务三…

[附源码]Python计算机毕业设计SSM科技项目在线评审系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

segmenter

patch embedding:例如输入图片大小为224x224,将图片分为固定大小的patch,patch大小为16x16,则每张图像会生成224x224/16x16196个patch,即输入序列长度为196,每个patch维度16x16x3768,线性投射层…

hexo+github手把手教你部署个人博客

一、安装并配置Node.js(原本就有安装) 参考:(1条消息) Node.js安装与配置(详细步骤)_普通网友的博客-CSDN博客_nodejs安装配置 一、下载Node.js官网下载 安装位置与环境变量配置 系统属性-环境变量-系统变量-Path 验…

129页4万字某智慧能源集团数字化管控平台项目 建设方案

目录 数字化管控平台相关项目建议书 1 目录: 1 一、相关项目背景 2 二、需求理解 3 2.1 需求理解 3 三、方案设计 5 3.1 整体方案设计 7 3.3.1 整体架构 7 3.3.2 解决方案说明 8 3.3.3 需求应答 10 3.2 数据仓库 11 3.2.1 数据仓库架构 11 3.2.2 数据仓库产品说明 1…

springMVC01,【第一个springMVC例子(注解版):HelloWorld】

springMVC01,【第一个springMVC例子-注解版:HelloWorld】创建项目1.配置web.xml2.编写spring配置文件3.controller层3.1RequestMapping注解4.运行测试5.小结链接: springMVC01,springMVC的执行流程【第一个springMVC例子(XML配置版本)&#x…

一种多引擎可视化数据流实现方案

企业大数据处理的挑战 随着大数据时代的到来,数据量迅猛增长,给传统的分析技术带来了巨大的冲击和挑战,企业面临着大数据处理的巨大挑战。将复杂的大数据处理问题进行简化,以便企业有更多人能够进行大数据处理,进而整…

使用azure-data factory

data-fatory介绍 Azure Data Factory(简写 ADF)是Azure的云ETL服务,简单的说,就是云上的SSIS。ADF是基于云的ETL,用于数据集成和数据转换,不需要代码,直接通过UI(code-free UI&…

[附源码]SSM计算机毕业设计疫情防控期间人员档案追寻系统设计与实现论文JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

操作系统实验5:信号量的实现与应用

写在最前的总结 下面的实验内容是在完整做完实验时候补充的,这里先把踩过的坑记录一下。 调试总结 先在Ubuntu上模拟生产者—消费者问题。这个实验分为两大部分,一个是实现信号量,另一个是验证信号量。对于第二个,建议先在Ubun…

银河麒麟 linux V10 安装JDK

1、安装JDK之前,先查看系统是否已安装JDK相关软件包: 2. 如果已经安装过,可以先卸载(可以跳过) 3. 下载并解压jdk包 # 将下载好的jdk压缩包解压到指定目录/usr/local/jdk8 mkdir /usr/local/jdk8 cp jdk-8u271-linu…

详解设计模式:享元模式

享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式。 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能。它提供了减少对象数量从而改善应用所需的对象…

[附源码]Python计算机毕业设计SSM跨移动平台的新闻阅读应用(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

二、Eureka服务注册与发现

Eureka服务注册与发现 Eureka基础知识 什么是服务治理 SpringCloud封装了Netflix公司开发的Eureka模块来实现服务治理。 在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂、所以需要进行服务治理,管理服务与服务之间依赖关联&…