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

作者:翟天保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…

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双检; 【征稿领域】地球观测、环境监测和管理相关或结合研究均可; 【案例分享】重…

前端面试练习24.3.8

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

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

装饰器模式(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数组表示地图,每个位置上的字符表示对应的元素…

c语言在线聊天室

c语言基于tcp和多线程的在线聊天室(c语言通讯系统)功能需求 1.实现多线程 2.构建socke套接字实现一对一通信 3.实现多个电脑的通信 4.数据传输加密和解密 5.多人实时聊天 6.具备群聊和私聊的功能 实现原理: 服务端公网Ip暴露,客户端端口随机分配,通过服务端公网IP连接,服务端…

【开源】SpringBoot框架开发免税店商城管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2 研究方法 三、系统展示四、核心代码4.1 查询免税种类4.2 查询物品档案4.3 新增顾客4.4 新增消费记录4.5 审核免税 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的免税店商城管理系…

【文本编辑】Typora v1.8.6 绿色版

下载地址 Typora v1.8.6 绿色版 简介 Typora 是一款简洁、直观的跨平台 Markdown 编辑器,旨在提供优雅的写作体验。与传统的 Markdown 编辑器不同,Typora 提供所见即所得的编辑界面,使用户可以即时预览 Markdown 文档的渲染效果&#xff0…

prometheus 原理(架构,promql表达式,描点原理)

大家好,我是蓝胖子,提到监控指标,不得不说prometheus,今天这篇文章我会对prometheus 的架构设计,promql表达式原理和监控图表的绘图原理进行详细的解释。来让大家对prometheus的理解更加深刻。 架构设计 先来看看&am…