基于梯度统计学的渐变型亮缝识别算法

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、场景痛点

       在图像处理相关的实际工程中,会出现各式各样的现实复杂问题,有的是因为机械设计导致,有的是因为硬件引起(相机、探测器、传感器等),有的是外部环境引起。这些问题跟我们的图像处理工作带来了困难和挑战。

       本文提出的场景是在捕捉图像过程中,图像中出现了某种不在预期的亮缝信息,我们要做的就是对其进行补偿修正,而修正的前提是识别,本文重点关注如何识别亮缝的感兴趣区域ROI。该场景的痛点就在于亮缝信息是覆盖在原数据之上的,而原数据本身的信息复杂度是不固定的,可能会出现各种各样的实体轮廓,因此在设计算法的时候,要尽可能地考虑周全,使得算法具备一定适用性、鲁棒性。

       针对此场景,本文提出了一种基于梯度统计学的渐变型亮缝识别算法,接下来将简单介绍下算法原理和流程,并展示相关的效果图。

二、算法原理和流程

       亮缝信息往往有不同特征,有的是突变型,这种也是比较好提取的,有的是渐变型,即逐渐变亮再变暗的,本文关注的也是此类亮缝。

2.1 梯度计算

       待识别图像如下所示,不难发现图像出现了一层明显的亮缝,对于渐变型亮缝,我们第一时间想到的自然是导数,即数据的变化值,而导数给予方向性后也就是我们常说的梯度。

       对其XY方向分别进行导数计算,如下图所示。

       进而得到了梯度信息,我所测试的数据是沿X轴移动的亮缝,因此只考虑X方向即可。

2.2 统计提取

       观察梯度信息,可以发现亮缝在其移动方向上呈现特征是先上升再平稳后下降的过程,那我们识别亮缝问题就转为了识别一个上升区和一个下降区的组合。对梯度图像中亮缝形体方向即Y方向进行梯度统计。

      若梯度值大于0则归为上升,若梯度值小于等于0则归为下降;建立一个上升掩膜和一个下降掩膜;对每一个x而言,遍历y,用上升计数值posCount和下降计数值negCount分别累计梯度的升降数量;若累计上升数超过统计阈值,则在上升掩膜中,将该x对应的所有y值设为255;若累计下降数超过统计阈值,则在下降掩膜中,将该x对应的所有y值设为255。

      统计后的掩膜图如下所示,先上升掩膜,后下降掩膜:

       如上所示,一个上升区和一个下降区就构成了亮缝,接下来要进行进一步的处理。

2.3 图像处理

       虽然上面的图看起来比较理想,但前文也说过,若亮缝所处图像的基底图像信息复杂度偏高,此时的掩膜信息中就会出现如下几种异常情况。

  1. 掩膜中出现某个很窄的区。这不是亮缝的一部分,而是原图像基底的某种特征与上述识别原理在一定程度上重合引起的。
  2. 掩膜中上升区或下降区并非是完整的,中间可能存在很窄的一列空洞。这是因为亮缝叠加了某些信息后,其梯度变化收到了一定程度的干扰,呈非连续态。
  3. 只识别到亮缝的上升区或下降区,或者都没识别到。亮缝叠加了某些信息后,其特征不再是渐变特征,而是变成了不规则态。

       针对上述三种常见情况,第三种因为亮缝本身的特征偏离了算法识别的核心原理,因此无法成功识别。而第一种情况,可通过开运算先腐蚀后膨胀的方式处理掉,第二种情况,可通过闭运算先膨胀后腐蚀的方式处理掉。

2.4 亮缝识别

       经过图像处理后的上升掩膜和下降掩膜,分别提取其连通域轮廓信息,计算中心点;基于欧氏距离,计算上升掩膜中各个区和下降掩膜中各个区的中心点距离,取最短距离且符合先上升后下降特征的一对组合,作为目标亮缝的上升区和下降区;两区进行连接,即可得到亮缝的ROI。

2.5 算法流程图

       综上,该算法的流程图可简化为:

三、代码分享

main.cpp

#include "globalfunc.h"int main()
{// 文件夹目录string folder = "data/";// 文件路径string path;path = folder + "1.his";// 读取源数据cv::Mat src = GlobalFunc::readHisPicture(path);// 基于梯度统计学的渐变型亮缝识别算法(单缝)cv::Mat look;cv::Rect roi;bool findFlag = GlobalFunc::identifyBrightSeamBasedOnGradientStatistics(src, look, roi);// 显示imshow("Ori", src);imshow("Result", look);cv::waitKey(0);return 0;
}

       本文仅用于本人复盘技术思路,C++完整代码不进行分享,有想要技术交流的同学可以私聊我,大家共同进步。

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

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

相关文章

【洛谷 P8668】[蓝桥杯 2018 省 B] 螺旋折线 题解(数学+平面几何)

[蓝桥杯 2018 省 B] 螺旋折线 题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点 ( X , Y ) (X, Y) (X,Y),我们定义它到原点的距离 dis ( X , Y ) \text{dis}(X, Y) dis(X,Y) 是从原点到 ( X , Y ) (X, Y) (X,Y) 的螺旋折线段的长度。 例如 …

新手做抖音小店,一定要避坑的五件事,非常重要!

大家好,我是电商糖果 现在做抖音小店已经进入一个稳定期,商家只要掌握正确的做店流程,然后把选品做好。 就可以将店铺做起来。 但这一切的前提是我们用对方法,这个很关键,因为这决定了你后面店铺的发展。 这篇文章…

蓝桥杯练习系统(算法训练)ALGO-981 过河马

资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后,这匹马表示它不开心了……   于是&#xff0c…

C++、MFC中操作excel时,CRange中get_Rows()、get_Columns()及get_Count()函数的用法及区别是什么?

在C、MFC中操作Excel时,CRange类中的get_Rows()、get_Columns()和get_Count()函数都是用于获取指定范围的行数、列数或单元格数量的函数,但它们的具体用法和区别如下: get_Rows() 用法:LPDISPATCH get_Rows();功能:返回…

Java教程:RabbitMq讲解与SpringBoot项目如何对接RabbitMq实现生产者与消费者

在往期文章中,我们讲了如何在Windows与Linux环境下安装RabbitMq服务,并访问Web管理端。 有很多同学其实并不知道RabbitMq是用来干嘛的,它起到一个什么作用,并且如何在常见的SpringBoot项目中集成mq并实现消息收发,本章…

Nginx实现高并发

注:文章是4年前在自己网站上写的,迁移过来了。现在看我之前写的这篇文章,描述得不是特别详细,但描述了Nginx的整体架构思想。如果对Nginx玩得透得或者想了解深入的,可以在网上找找其他的文章。 ......................…

day17_订单(结算,提交订单,支付页,立即购买,我的订单)

文章目录 订单模块1 结算1.1 需求说明1.2 获取用户地址1.2.1 UserAddress1.2.2 UserAddressController1.2.3 UserAddressService1.2.4 UserAddressMapper1.2.5 UserAddressMapper.xml 1.3 获取购物项数据1.3.1 CartController1.3.2 CartService1.3.3 openFeign接口定义 1.4 环境…

NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065

首先来看一下整体的流程: 可以看到了用到了上面的这些处理器,然后我们主要看看,这里之前 同步的时候,总是出现重复的数据,奇怪. 比如源表中只有166条数据,但是同步过去以后变成了11万条数据了. ${db.table.name:equals(table1):or(${db.table.name:equals(table2)})} 可以看…

【精选好刊】JCR2区SCI仅17天上线见刊,最后10篇版面!

录用案例 JCR2区地质环境类SCI&EI (进展顺) 【期刊简介】IF:3.0-4.0,JCR2区,中科院3/4区; 【检索情况】SCI&EI双检; 【征稿领域】地球观测、环境监测和管理相关或结合研究均可; 【案例分享】重…

[数据集][目标检测]遥感图像游泳池检测数据集VOC+YOLO格式288张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):288 标注数量(xml文件个数):288 标注数量(txt文件个数):288 标注类别…

前端面试练习24.3.8

防抖和节流 防抖(Debouncing): 防抖是指在短时间内连续触发同一事件时,只执行最后一次触发的事件处理函数。 在实际应用中,常常用于处理用户输入的搜索框或者滚动事件。例如,当用户连续输入搜索关键词时&am…

macos系统中redis如何设置密码

在 macOS 上设置 Redis 密码的步骤与在其他操作系统上大致相同,关键是要找到并编辑 Redis 配置文件,然后重启 Redis 服务。以下是详细步骤: 找到 Redis 配置文件:如果你是通过 Homebrew 安装的 Redis,配置文件通常位于…

业务代码中如何使用装饰器模式?

装饰器模式(Decorator Pattern)介绍 装饰器模式(Decorator Pattern)是一种结构型设计模式,我们可以动态地给一个对象添加额外的职责。而不是通过继承增加子类的方式来扩展对象的功能,装饰器模式使用组合的…

[N1CTF 2018]eating_cms 不会编程的崽

题倒是不难,但是实在是恶心到了。 上来就是登录框,页面源代码也没什么特别的。寻思抓包看一下,数据包直接返回了sql查询语句。到以为是sql注入的题目,直到我看到了单引号被转义。。。挺抽象,似乎sql语句过滤很严格。又…

Java基础知识点之思维导图

一、走进Java编程世界 二、变量常量和运算符 三、if选择结构 四、switch选择结构 五、while循环结构 六、for循环结构 七、数组 八、类与对象 九、深入循环结构 十、类的无参方法 十一、类的带参方法 十二、字符串

读已提交隔离级别下竟然有间隙锁

业务背景 广告主痛点的为进行一次全媒体联合投放,若投放10个媒体,需要制作和上传10个创意、50张不同尺寸和出血区要求的图片和视频素材、近100个元素,投放成本极高。这也是制约部分用户使用新产品投放的原因。 因此进行升级。以三个创意为例…

Prometheus添加nginx节点显示不支持stub_status 解决办法

1、我们在使用Prometheus监控添加nginx节点监控的时候,在被监控节点的nginx配置文件中添加下面的模块 server { listen 80; server_name localhost; location /stub_status { stub_status on; access_log off; …

微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(四):消息队列MQ

文章目录 一、消息队列MQ二、RabbitMQ2.1 单机部署2.2 消息模型 三、SpringAMAP3.1 简单消息队列3.2 工作消息队列3.3 发布-订阅模型:FanoutExchange 广播交换机3.4 发布-订阅模型:DirectExchange 路由交换机3.5 发布-订阅模型:TopicExchange…

Day29:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作

目录 JS原生开发-DOM树-用户交互 JS导入库开发-编码加密-逆向调试 思维导图 JS知识点: 功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等 技术:原生开发&#x…

推房子游戏c++

这段代码是一个推箱子游戏的实现。游戏中有一个地图,地图上有墙壁、人、箱子和目标位置。玩家通过键盘输入WASD或方向键来控制人物的移动,目标是将所有的箱子推到相应的目标位置上。 代码中的dt数组表示地图,每个位置上的字符表示对应的元素…